}
case MR_PRECACHE:
{
- precache_model ("models/monsters/mage.dpm");
++ precache_model("models/monsters/mage.dpm");
precache_sound ("weapons/grenade_impact.wav");
precache_sound ("weapons/tagexp1.wav");
return TRUE;
}
case MR_PRECACHE:
{
- precache_model ("models/monsters/shambler.mdl");
++ precache_model("models/monsters/shambler.mdl");
return TRUE;
}
}
}
case MR_PRECACHE:
{
- precache_model ("models/monsters/spider.dpm");
++ precache_model("models/monsters/spider.dpm");
precache_sound ("weapons/electro_fire2.wav");
return TRUE;
}
}
case MR_PRECACHE:
{
- precache_model ("models/monsters/wizard.mdl");
++ precache_model("models/monsters/wizard.mdl");
return TRUE;
}
}
}
case MR_PRECACHE:
{
- precache_model ("models/monsters/zombie.dpm");
++ precache_model("models/monsters/zombie.dpm");
return TRUE;
}
}
e.mins = min_s;
e.maxs = max_s;
e.model = strzone(strcat("models/monsters/", modelname));
--
-- #ifndef MENUQC
- precache_model(e.model);
-- func(MR_PRECACHE);
-- #endif
}
float m_null(float dummy) { return 0; }
void register_monsters_done()
// number of monsters spawned with mobspawn command
totalspawned -= 1;
-- if(IS_CLIENT(self.realowner))
-- self.realowner.monstercount -= 1;
--
SUB_SetFade(self, time + 3, 1);
}
}
// number of monsters spawned with mobspawn command
totalspawned -= 1;
-- if(IS_CLIENT(self.realowner))
-- self.realowner.monstercount -= 1;
--
self.think = SUB_Remove;
self.nextthink = time + 0.1;
+ self.event_damage = func_null;
}
}
{
// number of monsters spawned with mobspawn command
totalspawned -= 1;
--
-- if(IS_CLIENT(self.realowner))
-- self.realowner.monstercount -= 1;
}
if(self.candrop && self.weapon)
}
}
--void monster_setupcolors()
++void monster_setupcolors(entity mon)
{
-- if(IS_PLAYER(self.monster_owner))
-- self.colormap = self.monster_owner.colormap;
-- else if(teamplay && self.team)
-- self.colormap = 1024 + (self.team - 1) * 17;
++ if(IS_PLAYER(mon.monster_owner))
++ mon.colormap = mon.monster_owner.colormap;
++ else if(teamplay && mon.team)
++ mon.colormap = 1024 + (mon.team - 1) * 17;
else
{
-- if(self.monster_skill <= MONSTER_SKILL_EASY)
-- self.colormap = 1029;
-- else if(self.monster_skill <= MONSTER_SKILL_MEDIUM)
-- self.colormap = 1027;
-- else if(self.monster_skill <= MONSTER_SKILL_HARD)
-- self.colormap = 1038;
-- else if(self.monster_skill <= MONSTER_SKILL_INSANE)
-- self.colormap = 1028;
-- else if(self.monster_skill <= MONSTER_SKILL_NIGHTMARE)
-- self.colormap = 1032;
++ if(mon.monster_skill <= MONSTER_SKILL_EASY)
++ mon.colormap = 1029;
++ else if(mon.monster_skill <= MONSTER_SKILL_MEDIUM)
++ mon.colormap = 1027;
++ else if(mon.monster_skill <= MONSTER_SKILL_HARD)
++ mon.colormap = 1038;
++ else if(mon.monster_skill <= MONSTER_SKILL_INSANE)
++ mon.colormap = 1028;
++ else if(mon.monster_skill <= MONSTER_SKILL_NIGHTMARE)
++ mon.colormap = 1032;
else
-- self.colormap = 1024;
++ mon.colormap = 1024;
++ }
++}
++
++void monster_changeteam(entity ent, float newteam)
++{
++ if(!teamplay) { return; }
++
++ ent.team = newteam;
++ ent.monster_attack = TRUE; // new team, activate attacking
++ monster_setupcolors(ent);
++
++ if(ent.sprite)
++ {
++ WaypointSprite_UpdateTeamRadar(ent.sprite, RADARICON_DANGER, ((newteam) ? Team_ColorRGB(newteam) : '1 0 0'));
++
++ ent.sprite.team = newteam;
++ ent.sprite.SendFlags |= 1;
}
}
return TRUE;
}
-float monster_initialize(float mon_id, float nodrop)
+float monster_initialize(float mon_id)
{
- if(!autocvar_g_monsters)
- return FALSE;
+ if(!autocvar_g_monsters) { return FALSE; }
-
++ if(!(self.spawnflags & MONSTERFLAG_RESPAWNED)) { MON_ACTION(mon_id, MR_PRECACHE); }
+ if(Monster_CheckAppearFlags(self, mon_id)) { return TRUE; } // return true so the monster isn't removed
entity mon = get_monsterinfo(mon_id);
return FALSE;
if(!(self.spawnflags & MONSTERFLAG_RESPAWNED))
-- monster_setupcolors();
++ monster_setupcolors(self);
CSQCMODEL_AUTOINIT();
.float monster_attack;
.entity monster_owner; // new monster owner entity, fixes non-solid monsters
--.float monstercount; // per player monster count
.float stat_monsters_killed; // stats
.float stat_monsters_total;
org = player.origin + player.view_ofs;
traceline_antilag_force(player, org, org + screenforward * MAX_SHOT_DISTANCE, MOVE_NORMAL, player, lag);
-- if(IS_CLIENT(trace_ent))
++ if(IS_CLIENT(trace_ent) || (trace_ent.flags & FL_MONSTER))
{
antilag_takeback(trace_ent, time - lag);
hitplot = W_HitPlotNormalizedUntransform(org, trace_ent, screenforward, screenright, screenup, trace_endpos);
{
entity e;
string tospawn;
-- float moveflag;
++ float moveflag, monstercount = 0;
moveflag = (argv(2) ? stof(argv(2)) : 1); // follow owner if not defined
tospawn = strtolower(argv(1));
return;
}
++ FOR_EACH_MONSTER(e)
++ {
++ if(e.realowner == self)
++ ++monstercount;
++ }
++
if(autocvar_g_monsters_max <= 0 || autocvar_g_monsters_max_perplayer <= 0) { sprint(self, "Monster spawning is disabled.\n"); return; }
else if(!IS_PLAYER(self)) { sprint(self, "You can't spawn monsters while spectating.\n"); return; }
else if(MUTATOR_CALLHOOK(AllowMobSpawning)) { sprint(self, "Monster spawning is currently disabled by a mutator.\n"); return; }
else if(!autocvar_g_monsters) { Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_MONSTERS_DISABLED); return; }
else if(self.vehicle) { sprint(self, "You can't spawn monsters while driving a vehicle.\n"); return; }
+ else if(self.freezetag_frozen) { sprint(self, "You can't spawn monsters while frozen.\n"); return; }
else if(autocvar_g_campaign) { sprint(self, "You can't spawn monsters in campaign mode.\n"); return; }
else if(self.deadflag != DEAD_NO) { sprint(self, "You can't spawn monsters while dead.\n"); return; }
-- else if(self.monstercount >= autocvar_g_monsters_max_perplayer) { sprint(self, "You have spawned too many monsters, kill some before trying to spawn any more.\n"); return; }
++ else if(monstercount >= autocvar_g_monsters_max_perplayer) { sprint(self, "You have spawned too many monsters, kill some before trying to spawn any more.\n"); return; }
else if(totalspawned >= autocvar_g_monsters_max) { sprint(self, "The global maximum monster count has been reached, kill some before trying to spawn any more.\n"); return; }
else if(tospawn != "")
{
}
}
- if(found)
+ if(found || tospawn == "random")
{
-- self.monstercount += 1;
totalspawned += 1;
makevectors(self.v_angle);
++removed_count;
}
-- FOR_EACH_PLAYER(head)
-- head.monstercount = 0;
--
monsters_total = 0; // reset stats?
monsters_killed = 0;
if(autocvar_g_antilag == 0 || self.cvar_cl_noantilag)
lag = 0; // only do hitscan, but no antilag
if(lag)
++ {
FOR_EACH_PLAYER(pl)
if(pl != self)
antilag_takeback(pl, time - lag);
++ FOR_EACH_MONSTER(pl)
++ antilag_takeback(pl, time - lag);
++ }
WarpZone_trace_forent = self;
}
if(lag)
++ {
FOR_EACH_PLAYER(pl)
if(pl != self)
antilag_restore(pl);
++ FOR_EACH_MONSTER(pl)
++ antilag_restore(pl);
++ }
}
float W_CheckProjectileDamage(entity inflictor, entity projowner, float deathtype, float exception)