// =========================
-// SVQC Monster Properties
+// SVQC Monster Properties
// =========================
float Monster_SkillModifier()
{
float t = 0.5+self.monster_skill*((1.2-0.3)/10);
-
+
return t;
}
if(SAME_TEAM(targ, ent))
return FALSE; // enemy is on our team
-
+
if (targ.frozen)
return FALSE; // ignore frozen
{
self.revive_progress = bound(0, self.revive_progress + self.ticrate * self.revive_speed, 1);
self.health = max(1, self.max_health * self.revive_progress);
-
+
WaypointSprite_UpdateHealth(self.sprite, self.health);
-
+
movelib_beak_simple(stopspeed);
-
+
self.frame = manim_idle;
-
+
self.enemy = world;
self.nextthink = time + self.ticrate;
targ = monster_target;
runspeed = bound(0, monster_speed_run * Monster_SkillModifier(), runspeed * 2); // limit maxspeed to prevent craziness
walkspeed = bound(0, monster_speed_walk * Monster_SkillModifier(), walkspeed * 2); // limit maxspeed to prevent craziness
-
+
if(time < self.spider_slowness)
{
runspeed *= 0.5;
{
if(!mon)
return; // nothing to remove
-
+
pointparticles(particleeffectnum("item_pickup"), mon.origin, '0 0 0', 1);
-
+
if(mon.weaponentity)
remove(mon.weaponentity);
-
+
if(mon.iceblock)
remove(mon.iceblock);
-
+
WaypointSprite_Kill(mon.sprite);
-
+
remove(mon);
}
void monster_dead_think()
{
self.nextthink = time + self.ticrate;
-
+
CSQCMODEL_AUTOUPDATE();
if(self.ltime != 0)
{
setorigin(self, self.pos1);
self.angles = self.pos2;
-
+
Unfreeze(self); // remove any icy remains
self.health = self.max_health;
if(self.health <= -100) // 100 health until gone?
{
Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);
-
+
if(IS_CLIENT(self.realowner))
if(!self.monster_respawned)
self.realowner.monstercount -= 1;
self.think = monster_dead_think;
self.nextthink = time;
self.ltime = time + 5;
-
+
if ( self.frozen )
{
Unfreeze(self); // remove any icy remains
self.health = 0; // reset by Unfreeze
}
-
+
monster_dropitem();
MonsterSound(monstersound_death, 0, FALSE, CH_VOICE);
if(!(self.spawnflags & MONSTERFLAG_SPAWNED) && !self.monster_respawned)
monsters_killed += 1;
-
+
if(IS_PLAYER(attacker))
- if( autocvar_g_monsters_score_spawned ||
+ if( autocvar_g_monsters_score_spawned ||
( !(self.spawnflags & MONSTERFLAG_SPAWNED) && !self.monster_respawned) )
PlayerScore_Add(attacker, SP_SCORE, +autocvar_g_monsters_score_kill);
{
// number of monsters spawned with mobspawn command
totalspawned -= 1;
-
+
if(IS_CLIENT(self.realowner))
if(!self.monster_respawned)
self.realowner.monstercount -= 1;
void monsters_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
{
-
+
if(self.frozen && deathtype != DEATH_KILL)
return;
save = v_y;
self.health -= take;
-
+
WaypointSprite_UpdateHealth(self.sprite, self.health);
self.dmg_time = time;
self.target2 = self.oldtarget2; // reset to original target on death, incase we respawn
monster_die(attacker, (self.health <= -100 || deathtype == DEATH_KILL));
-
+
WaypointSprite_Kill(self.sprite);
-
+
frag_attacker = attacker;
frag_target = self;
MUTATOR_CALLHOOK(MonsterDies);
{
self.think = monster_think;
self.nextthink = self.ticrate;
-
+
if(self.ltime)
if(time >= self.ltime)
{
}
MON_ACTION(self.monsterid, MR_THINK);
-
+
CSQCMODEL_AUTOUPDATE();
}
self.max_health = self.health;
self.pain_finished = self.nextthink;
-
+
if(IS_PLAYER(self.monster_owner))
self.effects |= EF_DIMLIGHT;
if(!self.attack_range)
self.attack_range = autocvar_g_monsters_attack_range;
-
+
precache_monstersounds();
UpdateMonsterSounds();
if(teamplay)
self.monster_attack = TRUE; // we can have monster enemies in team games
-
+
MonsterSound(monstersound_spawn, 0, FALSE, CH_VOICE);
-
+
WaypointSprite_Spawn(M_NAME(self.monsterid), 0, 1024, self, '0 0 1' * (self.maxs_z + 15), world, self.team, self, sprite, TRUE, RADARICON_DANGER, ((self.team) ? Team_ColorRGB(self.team) : '1 0 0'));
WaypointSprite_UpdateMaxHealth(self.sprite, self.max_health);
WaypointSprite_UpdateHealth(self.sprite, self.health);
self.think = monster_think;
self.nextthink = time + self.ticrate;
-
+
if(MUTATOR_CALLHOOK(MonsterSpawn))
return FALSE;
-
+
return TRUE;
}
return FALSE;
entity mon = get_monsterinfo(mon_id);
-
+
if(!self.monster_skill)
self.monster_skill = cvar("g_monsters_skill");
self.spider_slowness = 0;
self.gravity = 1;
self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_BOTCLIP | DPCONTENTS_MONSTERCLIP;
-
+
if(autocvar_g_fullbrightplayers)
self.effects |= EF_FULLBRIGHT;
-
+
if(autocvar_g_nodepthtestplayers)
self.effects |= EF_NODEPTHTEST;
if(!self.monster_moveflags)
self.monster_moveflags = MONSTER_MOVE_WANDER;
-
+
if(!self.noalign)
{
setorigin(self, self.origin + '0 0 20');
tracebox(self.origin + '0 0 64', self.mins, self.maxs, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
setorigin(self, trace_endpos);
}
-
+
if(!monster_spawn())
return FALSE;
-
+
if(!self.monster_respawned)
monster_setupcolors();
-
+
CSQCMODEL_AUTOINIT();
return TRUE;