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