1 const vector SLIME_MIN = '-16 -16 -24';
2 const vector SLIME_MAX = '16 16 16';
4 string SLIME_MODEL = "models/monsters/slime.dpm";
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;
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;
21 self.think = slime_think;
22 self.nextthink = time + self.ticrate;
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);
27 void slime_touch_jump()
32 if(vlen(self.velocity) > 200)
34 Damage (self, world, world, self.health + self.max_health + 200, DEATH_MONSTER_SLIME, self.origin, '0 0 0');
39 if(trace_dphitcontents)
41 self.touch = MonsterTouch;
42 self.movetype = MOVETYPE_WALK;
46 float slime_attack(float attack_type)
50 case MONSTER_ATTACK_MELEE:
51 case MONSTER_ATTACK_RANGED:
53 makevectors(self.angles);
54 if(monster_leap(slime_anim_jump, slime_touch_jump, v_forward * 600 + '0 0 200', 0.5))
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);
73 self.health = -100; // gibbed
76 Monster_CheckDropCvars ("slime"); // drop items after exploding to prevent player picking up item before dying
78 self.deadflag = DEAD_DEAD;
79 self.think = Monster_Fade;
80 self.nextthink = time + 0.1;
84 self.event_damage = func_null; // reset by monster_hook_death
85 self.takedamage = DAMAGE_NO;
90 self.think = slime_dead;
91 self.nextthink = time;
92 self.event_damage = func_null;
93 self.movetype = MOVETYPE_NONE;
97 self.SendFlags |= MSF_MOVE | MSF_STATUS;
103 self.health = autocvar_g_monster_slime_health;
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;
111 monsters_setframe(slime_anim_idle);
113 monster_setupsounds("slime");
115 monster_hook_spawn(); // for post-spawn mods
118 void spawnfunc_monster_slime()
120 if not(autocvar_g_monster_slime) { remove(self); return; }
122 self.monster_spawnfunc = spawnfunc_monster_slime;
124 if(Monster_CheckAppearFlags(self))
127 if not (monster_initialize(
128 "Slime", MONSTER_SLIME,
129 SLIME_MIN, SLIME_MAX,
131 slime_die, slime_spawn))
138 // compatibility with old spawns
139 void spawnfunc_monster_tarbaby() { spawnfunc_monster_slime(); }