REGISTER_MONSTER(
/* MON_##id */ ANIMUS,
/* function */ m_animus,
-/* spawnflags */ MONSTER_SIZE_BROKEN | MON_FLAG_MELEE,
+/* spawnflags */ MONSTER_SIZE_BROKEN | MON_FLAG_MELEE | MON_FLAG_MUTATORBLOCKED,
/* mins,maxs */ '-41 -41 -31', '41 41 31',
/* model */ "demon.mdl",
/* netname */ "animus",
REGISTER_MONSTER(
/* MON_##id */ BRUISER,
/* function */ m_bruiser,
-/* spawnflags */ MONSTER_SIZE_BROKEN | MON_FLAG_MELEE,
+/* spawnflags */ MONSTER_SIZE_BROKEN | MON_FLAG_MELEE | MON_FLAG_MUTATORBLOCKED,
/* mins,maxs */ '-20 -20 -31', '20 20 53',
/* model */ "knight.mdl",
/* netname */ "bruiser",
REGISTER_MONSTER(
/* MON_##id */ BRUTE,
/* function */ m_brute,
-/* spawnflags */ MON_FLAG_MELEE | MON_FLAG_RANGED,
+/* spawnflags */ MON_FLAG_MELEE | MON_FLAG_RANGED | MON_FLAG_MUTATORBLOCKED,
/* mins,maxs */ '-36 -36 -20', '36 36 50',
/* model */ "ogre.dpm",
/* netname */ "brute",
REGISTER_MONSTER(
/* MON_##id */ CERBERUS,
/* function */ m_cerberus,
-/* spawnflags */ MON_FLAG_MELEE,
+/* spawnflags */ MON_FLAG_MELEE | MON_FLAG_MUTATORBLOCKED,
/* mins,maxs */ '-16 -16 -24', '16 16 12',
/* model */ "dog.dpm",
/* netname */ "cerberus",
REGISTER_MONSTER(
/* MON_##id */ KNIGHT,
/* function */ m_knight,
-/* spawnflags */ MONSTER_SIZE_BROKEN | MON_FLAG_MELEE | MON_FLAG_RANGED,
+/* spawnflags */ MONSTER_SIZE_BROKEN | MON_FLAG_MELEE | MON_FLAG_RANGED | MON_FLAG_MUTATORBLOCKED,
/* mins,maxs */ '-20 -20 -32', '20 20 41',
/* model */ "hknight.mdl",
/* netname */ "knight",
REGISTER_MONSTER(
/* MON_##id */ SLIME,
/* function */ m_slime,
-/* spawnflags */ 0,
+/* spawnflags */ MON_FLAG_MUTATORBLOCKED,
/* mins,maxs */ '-16 -16 -24', '16 16 16',
/* model */ "slime.dpm",
/* netname */ "slime",
REGISTER_MONSTER(
/* MON_##id */ STINGRAY,
/* function */ m_stingray,
-/* spawnflags */ MONSTER_TYPE_SWIM | MONSTER_SIZE_BROKEN | MON_FLAG_MELEE,
+/* spawnflags */ MONSTER_TYPE_SWIM | MONSTER_SIZE_BROKEN | MON_FLAG_MELEE | MON_FLAG_MUTATORBLOCKED,
/* mins,maxs */ '-20 -20 -31', '20 20 20',
/* model */ "fish.mdl",
/* netname */ "stingray",
const float MON_FLAG_SUPERMONSTER = 256; // incredibly powerful monster
const float MON_FLAG_RANGED = 512; // monster shoots projectiles
const float MON_FLAG_MELEE = 1024;
+const float MON_FLAG_MUTATORBLOCKED = 2048;
// entity properties of monsterinfo:
.float monsterid; // MON_...
-entity spawnmonster (string monster, float mnster, entity spawnedby, entity own, vector orig, float respwn, float moveflag)
+entity spawnmonster (string monster, float monster_id, entity spawnedby, entity own, vector orig, float respwn, float moveflag)
{
// ensure spawnfunc database is initialized
initialize_field_db();
}
if(monster == "")
- if(mnster)
- monster = (get_monsterinfo(mnster)).netname;
+ if(monster_id)
+ monster = (get_monsterinfo(monster_id)).netname;
e.realowner = spawnedby;
if(moveflag)
e.monster_moveflags = moveflag;
+
+ if(e.team || !IS_PLAYER(spawnedby))
+ e.colormap = 1024;
+ else
+ e.colormap = spawnedby.colormap;
if(IS_PLAYER(spawnedby))
{
if(teamplay && autocvar_g_monsters_teams)
e.team = spawnedby.team; // colors handled in spawn code
- if(e.team)
- e.colormap = 1024;
- else
- e.colormap = spawnedby.colormap;
-
if(autocvar_g_monsters_owners)
e.monster_owner = own; // using .owner makes the monster non-solid for its master
-entity spawnmonster (string monster, float mnster, entity spawnedby, entity own, vector orig, float respwn, float moveflag);
+entity spawnmonster (string monster, float monster_id, entity spawnedby, entity own, vector orig, float respwn, float moveflag);
monster_checkattack(self, self.enemy);
}
+void monster_remove(entity mon)
+{
+ if not(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;
return FALSE;
entity mon = get_monsterinfo(mon_id);
+
+ if(mon.spawnflags & MON_FLAG_MUTATORBLOCKED)
+ {
+ dprint("Attempted to spawn a mutator-blocked monster rejected");
+ return FALSE;
+ }
// support for quake style removing monsters based on skill
if(monster_skill <= 1) if(self.spawnflags & MONSTERSKILL_NOTEASY) { return FALSE; }
void monsters_setstatus(); // monsters.qc
.float monster_moveflags; // checks where to move when not attacking
+void monster_remove(entity mon); // removes a monster
+
.float(float attack_type) monster_attackfunc;
const float MONSTER_ATTACK_MELEE = 1;
const float MONSTER_ATTACK_RANGED = 2;
FOR_EACH_MONSTER(head)
{
- if(head.weaponentity)
- remove(head.weaponentity);
-
- if(head.iceblock)
- remove(head.iceblock);
-
- WaypointSprite_Kill(head.sprite);
-
- remove(head);
+ monster_remove(head);
++removed_count;
}
if(round_handler_GetEndTime() > 0 && round_handler_GetEndTime() - time <= 0)
{
FOR_EACH_MONSTER(head)
- {
- if(head.weaponentity) remove(head.weaponentity);
- if(head.iceblock) remove(head.iceblock);
- WaypointSprite_Kill(head.sprite);
- remove(head);
- }
+ monster_remove(head);
if(roundcnt >= maxrounds)
{
{
if not(self.spawnflags & MONSTERFLAG_SPAWNED)
{
- if(self.weaponentity) remove(self.weaponentity);
- if(self.iceblock) remove(self.iceblock);
- WaypointSprite_Kill(self.sprite);
- remove(self);
+ monster_remove(self);
return FALSE;
}
float nt_IsNewToy(float w)
{
- switch(w)
+ if((get_weaponinfo(w)).weapon)
{
- case WEP_SEEKER:
- case WEP_MINE_LAYER:
- case WEP_HLAC:
- case WEP_RIFLE:
- return TRUE;
- default:
- return FALSE;
+ switch(w)
+ {
+ case WEP_SEEKER:
+ case WEP_MINE_LAYER:
+ case WEP_HLAC:
+ case WEP_RIFLE:
+ return TRUE;
+ }
}
+ else
+ {
+ switch(w)
+ {
+ case MON_ANIMUS:
+ case MON_BRUISER:
+ case MON_BRUTE:
+ case MON_CERBERUS:
+ case MON_KNIGHT:
+ case MON_SLIME:
+ case MON_STINGRAY:
+ return TRUE;
+ }
+ }
+
+ return FALSE;
}
string nt_GetFullReplacement(string w)
for(i = WEP_FIRST; i <= WEP_LAST; ++i)
if(nt_IsNewToy(i))
get_weaponinfo(i).spawnflags &= ~WEP_FLAG_MUTATORBLOCKED;
+
+ for(i = MON_FIRST; i <= MON_LAST; ++i)
+ if(nt_IsNewToy(i))
+ get_monsterinfo(i).spawnflags &= ~MON_FLAG_MUTATORBLOCKED;
}
MUTATOR_ONROLLBACK_OR_REMOVE
for(i = WEP_FIRST; i <= WEP_LAST; ++i)
if(nt_IsNewToy(i))
get_weaponinfo(i).spawnflags |= WEP_FLAG_MUTATORBLOCKED;
+
+ for(i = MON_FIRST; i <= MON_LAST; ++i)
+ if(nt_IsNewToy(i))
+ get_monsterinfo(i).spawnflags |= MON_FLAG_MUTATORBLOCKED;
}
MUTATOR_ONREMOVE