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