// size const vector TARBABY_MIN = '-16 -16 -24'; const vector TARBABY_MAX = '16 16 16'; // model string TARBABY_MODEL = "models/monsters/slime.dpm"; #ifdef SVQC // cvars float autocvar_g_monster_tarbaby; float autocvar_g_monster_tarbaby_health; float autocvar_g_monster_tarbaby_speed_walk; float autocvar_g_monster_tarbaby_speed_run; // animations const float tarbaby_anim_walk = 0; const float tarbaby_anim_idle = 1; const float tarbaby_anim_jump = 2; const float tarbaby_anim_fly = 3; const float tarbaby_anim_die = 4; const float tarbaby_anim_pain = 5; void tarbaby_think () { self.think = tarbaby_think; self.nextthink = time + self.ticrate; monster_move(autocvar_g_monster_tarbaby_speed_run, autocvar_g_monster_tarbaby_speed_walk, 20, tarbaby_anim_walk, tarbaby_anim_walk, tarbaby_anim_idle); } void Tar_JumpTouch () { if(self.health > 0) if(other.health > 0) if(other.takedamage) if(vlen(self.velocity) > 200) { // make the monster die self.event_damage(self, self, self.health + self.max_health + 200, DEATH_MONSTER_TARBABY, self.origin, '0 0 0'); return; } if (trace_dphitcontents) { self.touch = MonsterTouch; self.movetype = MOVETYPE_WALK; } } void tarbaby_jump () { self.movetype = MOVETYPE_BOUNCE; makevectors(self.angles); monster_leap(tarbaby_anim_jump, Tar_JumpTouch, v_forward * 600 + '0 0 200', 0.5); } float tbaby_jump () { tarbaby_jump(); return TRUE; } void tarbaby_blowup () { RadiusDamage(self, self, 250 * monster_skill, 15, 250 * (monster_skill * 0.7), world, 250, DEATH_MONSTER_TARBABY, world); pointparticles(particleeffectnum("explosion_medium"), self.origin, '0 0 0', 1); sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM); Monster_CheckDropCvars ("tarbaby"); // drop items after exploding to prevent player picking up item before dying setmodel(self, ""); } void tarbaby_explode() { tarbaby_blowup(); self.think = Monster_Fade; self.nextthink = time + 0.1; monster_hook_death(); self.event_damage = func_null; // reset by monster_hook_death self.takedamage = DAMAGE_NO; } void tarbaby_die () { self.think = tarbaby_explode; self.nextthink = time + 0.1; self.event_damage = func_null; self.movetype = MOVETYPE_NONE; self.enemy = world; self.health = 0; WaypointSprite_Kill(self.sprite); self.SendFlags |= MSF_MOVE | MSF_STATUS; } void tarbaby_spawn () { if not(self.health) self.health = autocvar_g_monster_tarbaby_health; self.damageforcescale = 0.003; self.classname = "monster_tarbaby"; self.checkattack = GenericCheckAttack; self.attack_ranged = tbaby_jump; self.attack_melee = tarbaby_jump; self.nextthink = time + random() * 0.5 + 0.1; self.think = tarbaby_think; monsters_setframe(tarbaby_anim_idle); monster_setupsounds("tarbaby"); monster_hook_spawn(); // for post-spawn mods } void spawnfunc_monster_tarbaby () { if not(autocvar_g_monster_tarbaby) { remove(self); return; } self.monster_spawnfunc = spawnfunc_monster_tarbaby; if(Monster_CheckAppearFlags(self)) return; if not (monster_initialize( "Slime", MONSTER_TARBABY, TARBABY_MIN, TARBABY_MAX, FALSE, tarbaby_die, tarbaby_spawn)) { remove(self); return; } } #endif // SVQC