void Monster_Move(entity this, float runspeed, float walkspeed, float stpspeed)
{
- if(this.target2) { this.goalentity = find(NULL, targetname, this.target2); }
+ // update goal entity if lost
+ if(this.target2 && this.goalentity.targetname != this.target2) { this.goalentity = find(NULL, targetname, this.target2); }
entity targ;
#include <server/autocvars.qh>
#include <server/defs.qh>
#endif
-entity spawnmonster (string monster, float monster_id, entity spawnedby, entity own, vector orig, float respwn, float invincible, float moveflag)
+entity spawnmonster (string monster, int monster_id, entity spawnedby, entity own, vector orig, bool respwn, bool invincible, int moveflag)
{
- float i;
entity e = spawn();
e.spawnflags = MONSTERFLAG_SPAWNED;
if(monster == "random")
{
- RandomSelection_Init();
- for(i = MON_FIRST; i <= MON_LAST; ++i)
- RandomSelection_Add(NULL, i, string_null, 1, 1);
+ RandomSelection_Init();
+ FOREACH(Monsters, it != MON_Null,
+ {
+ RandomSelection_Add(it, 0, string_null, 1, 1);
+ });
- monster_id = RandomSelection_chosen_float;
+ monster_id = RandomSelection_chosen_ent.monsterid;
}
else if(monster != "")
{
- float found = 0;
- entity mon;
- for(i = MON_FIRST; i <= MON_LAST; ++i)
+ bool found = false;
+ FOREACH(Monsters, it != MON_Null,
{
- mon = get_monsterinfo(i);
- if(mon.netname == monster)
+ if(it.netname == monster)
{
found = true;
- monster_id = mon.monsterid; // we have the monster, old monster id is no longer required
+ monster_id = it.monsterid; // we have the monster, old monster id is no longer required
break;
}
- }
+ });
if(!found)
monster_id = ((monster_id > 0) ? monster_id : MON_FIRST);
}
#pragma once
-entity spawnmonster (string monster, float monster_id, entity spawnedby, entity own, vector orig, float respwn, float invincible, float moveflag);
+entity spawnmonster (string monster, int monster_id, entity spawnedby, entity own, vector orig, bool respwn, bool invincible, int moveflag);
bool autocvar_g_invasion_zombies_only;
float autocvar_g_invasion_spawn_delay;
+.string spawnmob;
+
spawnfunc(invasion_spawnpoint)
{
if(!g_invasion) { delete(this); return; }
IL_PUSH(g_invasion_spawns, this);
if(autocvar_g_invasion_zombies_only) // precache only if it hasn't been already
- if(this.monsterid) {
- Monster mon = get_monsterinfo(this.monsterid);
- mon.mr_precache(mon);
+ if(this.spawnmob)
+ {
+ FOREACH(Monsters, it.netname == this.spawnmob,
+ {
+ it.mr_precache(it);
+ });
}
}
return RandomSelection_chosen_ent;
}
-void invasion_SpawnChosenMonster(float mon)
+void invasion_SpawnChosenMonster(int mon)
{
entity spawn_point, monster;
setthink(e, SUB_Remove);
e.nextthink = time + 0.1;
}
- else
- monster = spawnmonster("", ((spawn_point.monsterid) ? spawn_point.monsterid : mon), spawn_point, spawn_point, spawn_point.origin, false, false, 2);
+ else // if spawnmob field falls through (unset), fallback to mon (relying on spawnmonster for that behaviour)
+ monster = spawnmonster(spawn_point.spawnmob, mon, spawn_point, spawn_point, spawn_point.origin, false, false, 2);
if(spawn_point) monster.target2 = spawn_point.target2;
monster.spawnshieldtime = time;