]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/monsters/monster/slime.qc
e9f95f04ef59fa49208642274cac133e1d8acca3
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / monsters / monster / slime.qc
1 #ifdef REGISTER_MONSTER
2 REGISTER_MONSTER(
3 /* MON_##id   */ SLIME,
4 /* function   */ m_slime,
5 /* mins,maxs  */ '-16 -16 -24', '16 16 16',
6 /* model      */ "slime.dpm",
7 /* netname    */ "slime",
8 /* fullname   */ _("Slime")
9 );
10
11 #else
12 #ifdef SVQC
13 float autocvar_g_monster_slime;
14 float autocvar_g_monster_slime_health;
15 float autocvar_g_monster_slime_speed_walk;
16 float autocvar_g_monster_slime_speed_run;
17
18 const float slime_anim_walk             = 0;
19 const float slime_anim_idle             = 1;
20 const float slime_anim_jump             = 2;
21 const float slime_anim_fly              = 3;
22 const float slime_anim_die              = 4;
23 const float slime_anim_pain             = 5;
24
25 void slime_touch_jump()
26 {
27         if(self.health > 0)
28         if(other.health > 0)
29         if(other.takedamage)
30         if(vlen(self.velocity) > 200)
31         {
32                 Damage (self, world, world, self.health + self.max_health + 200, DEATH_MONSTER_SLIME, self.origin, '0 0 0');
33                         
34                 return;
35         }
36
37         if(trace_dphitcontents)
38         {
39                 self.touch = MonsterTouch;
40                 self.movetype = MOVETYPE_WALK;
41         }
42 }
43
44 float slime_attack(float attack_type)
45 {
46         switch(attack_type)
47         {
48                 case MONSTER_ATTACK_MELEE:
49                 case MONSTER_ATTACK_RANGED:
50                 {
51                         makevectors(self.angles);
52                         if(monster_leap(slime_anim_jump, slime_touch_jump, v_forward * 600 + '0 0 200', 0.5))
53                                 return TRUE;
54                 }
55         }
56         
57         return FALSE;
58 }
59
60 void slime_explode()
61 {
62         RadiusDamage(self, self, 250 * monster_skill, 15, 250 * (monster_skill * 0.7), world, 250, DEATH_MONSTER_SLIME, world);
63         pointparticles(particleeffectnum("explosion_medium"), self.origin, '0 0 0', 1);
64         sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
65         
66         setmodel(self, "");
67 }
68
69 void slime_dead()
70 {
71         self.health = -100; // gibbed
72         slime_explode();
73         
74         Monster_CheckDropCvars ("slime"); // TODO: add a special function to drop items after death
75         
76         self.deadflag = DEAD_DEAD;
77         self.think = Monster_Fade;
78         self.nextthink = time + 0.1;
79 }
80
81 void spawnfunc_monster_slime()
82 {
83         if not(autocvar_g_monster_slime) { remove(self); return; }
84         
85         self.classname = "monster_slime";
86         
87         self.monster_spawnfunc = spawnfunc_monster_slime;
88         
89         if(Monster_CheckAppearFlags(self))
90                 return;
91         
92         if not(monster_initialize(MON_SLIME, FALSE, 0)) { remove(self); return; }
93 }
94
95 // compatibility with old spawns
96 void spawnfunc_monster_tarbaby() { spawnfunc_monster_slime(); }
97
98 float m_slime(float req)
99 {
100         switch(req)
101         {
102                 case MR_THINK:
103                 {
104                         monster_move(autocvar_g_monster_slime_speed_run, autocvar_g_monster_slime_speed_walk, 20, slime_anim_walk, slime_anim_walk, slime_anim_idle);
105                         return TRUE;
106                 }
107                 case MR_DEATH:
108                 {
109                         self.think                      = slime_dead;
110                         self.nextthink          = time;
111                         self.event_damage   = func_null;
112                         self.movetype           = MOVETYPE_NONE;
113                         self.takedamage         = DAMAGE_NO;
114                         self.enemy                      = world;
115                         self.health                     = 0;
116                         
117                         self.SendFlags |= MSF_MOVE | MSF_STATUS;
118                         
119                         return TRUE;
120                 }
121                 case MR_SETUP:
122                 {
123                         if not(self.health) self.health = autocvar_g_monster_slime_health;
124                                 
125                         self.monster_attackfunc = slime_attack;
126                         monsters_setframe(slime_anim_idle);
127                         
128                         return TRUE;
129                 }
130                 case MR_INIT:
131                 {
132                         // nothing
133                         return TRUE;
134                 }
135         }
136         
137         return TRUE;
138 }
139
140 #endif // SVQC
141 #ifdef CSQC
142 float m_slime(float req)
143 {
144         switch(req)
145         {
146                 case MR_DEATH:
147                 {
148                         // nothing
149                         return TRUE;
150                 }
151                 case MR_INIT:
152                 {
153                         precache_model ("models/monsters/slime.dpm");
154                         return TRUE;
155                 }
156         }
157         
158         return TRUE;
159 }
160
161 #endif // CSQC
162 #endif // REGISTER_MONSTER