]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Clean up monster spawn function a little, allow setting invasion spawnpoints to spawn...
authorMario <mario@smbclan.net>
Wed, 28 Sep 2016 14:53:50 +0000 (00:53 +1000)
committerMario <mario@smbclan.net>
Wed, 28 Sep 2016 14:53:50 +0000 (00:53 +1000)
qcsrc/common/monsters/sv_monsters.qc
qcsrc/common/monsters/sv_spawn.qc
qcsrc/common/monsters/sv_spawn.qh
qcsrc/server/mutators/mutator/gamemode_invasion.qc

index 9ac1f4e14084f0adaa1ec8f40f2047ac14dd2ef9..02ad23817c67642f8026b737f466d94d168c4e47 100644 (file)
@@ -692,7 +692,8 @@ void Monster_CalculateVelocity(entity this, vector to, vector from, float turnra
 
 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;
 
index 50373cc2a232b85e1a93e403482776e6a81e2ae2..da924cf96b37ec7e8ba707f40f1e1a79c88d156a 100644 (file)
@@ -8,9 +8,8 @@
     #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;
@@ -22,26 +21,26 @@ entity spawnmonster (string monster, float monster_id, entity spawnedby, entity
 
        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);
        }
index 0aba5c19d4326f2220c89c576468d022263be4f3..00db84c1cb8372c14525b0bb8a98e5a9335fdfe3 100644 (file)
@@ -1,3 +1,3 @@
 #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);
index 515148c1bbdc06625c5b8161892785ac42014686..61fe75ea49fa6128066e5fb294a988f157e5deb1 100644 (file)
@@ -15,6 +15,8 @@ int autocvar_g_invasion_monster_count;
 bool autocvar_g_invasion_zombies_only;
 float autocvar_g_invasion_spawn_delay;
 
+.string spawnmob;
+
 spawnfunc(invasion_spawnpoint)
 {
        if(!g_invasion) { delete(this); return; }
@@ -23,9 +25,12 @@ spawnfunc(invasion_spawnpoint)
        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);
+               });
        }
 }
 
@@ -59,7 +64,7 @@ entity invasion_PickSpawn()
        return RandomSelection_chosen_ent;
 }
 
-void invasion_SpawnChosenMonster(float mon)
+void invasion_SpawnChosenMonster(int mon)
 {
        entity spawn_point, monster;
 
@@ -78,8 +83,8 @@ void invasion_SpawnChosenMonster(float mon)
                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;