]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/monsters/monster/slime.qc
d5f2bd9d0c1f7881f69f67b6ff01e75e83676e95
[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 */ MON_FLAG_MUTATORBLOCKED,
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                         return monster_leap(slime_anim_jump, slime_touch_jump, v_forward * 600 + '0 0 200', 0.5);
59                 }
60         }
61         
62         return FALSE;
63 }
64
65 void slime_explode()
66 {
67         RadiusDamage(self, self, MON_CVAR(slime, attack_explode_damage), 15, MON_CVAR(slime, attack_explode_damage) * 0.7, world, 250, DEATH_MONSTER_SLIME, world);
68         pointparticles(particleeffectnum("explosion_medium"), self.origin, '0 0 0', 1);
69         sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTEN_NORM);
70         
71         setmodel(self, "null");
72 }
73
74 void slime_dead()
75 {
76         self.health = -100; // gibbed
77         slime_explode();
78         
79         self.deadflag = DEAD_DEAD;
80         self.think = Monster_Fade;
81         self.nextthink = time + 0.1;
82         
83         CSQCMODEL_AUTOUPDATE(); // called now to update model
84 }
85
86 void spawnfunc_monster_slime()
87 {
88         self.classname = "monster_slime";
89         
90         self.monster_spawnfunc = spawnfunc_monster_slime;
91         
92         if(Monster_CheckAppearFlags(self))
93                 return;
94         
95         if not(monster_initialize(MON_SLIME, FALSE)) { remove(self); return; }
96 }
97
98 // compatibility with old spawns
99 void spawnfunc_monster_tarbaby() { spawnfunc_monster_slime(); }
100
101 float m_slime(float req)
102 {
103         switch(req)
104         {
105                 case MR_THINK:
106                 {
107                         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);
108                         return TRUE;
109                 }
110                 case MR_DEATH:
111                 {
112                         self.think                      = slime_dead;
113                         self.nextthink          = time;
114                         self.event_damage   = func_null;
115                         self.movetype           = MOVETYPE_NONE;
116                         self.takedamage         = DAMAGE_NO;
117                         self.enemy                      = world;
118                         self.health                     = 0;
119                         
120                         return TRUE;
121                 }
122                 case MR_SETUP:
123                 {
124                         if not(self.health) self.health = MON_CVAR(slime, health);
125                         
126                         self.monster_loot = spawnfunc_item_rockets;
127                         self.monster_attackfunc = slime_attack;
128                         self.frame = slime_anim_idle;
129                         
130                         return TRUE;
131                 }
132                 case MR_PRECACHE:
133                 {
134                         precache_model ("models/monsters/slime.dpm");
135                         precache_sound ("weapons/rocket_impact.wav");
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_PRECACHE:
155                 {
156                         precache_model ("models/monsters/slime.dpm");
157                         return TRUE;
158                 }
159         }
160         
161         return TRUE;
162 }
163
164 #endif // CSQC
165 #endif // REGISTER_MONSTER