From 1b02a1741768e165dbc657095af8d54a5179290e Mon Sep 17 00:00:00 2001 From: Mario Date: Sun, 13 Oct 2013 03:33:23 +1100 Subject: [PATCH] Cache monster list reply like map list & allow spawning mutator-blocked monsters with mobspawn command --- qcsrc/common/monsters/sv_monsters.qc | 2 +- qcsrc/common/util.qh | 2 +- qcsrc/server/command/cmd.qc | 11 ++--------- qcsrc/server/command/getreplies.qc | 15 +++++++++++++++ qcsrc/server/command/getreplies.qh | 1 + qcsrc/server/g_world.qc | 1 + qcsrc/server/mutators/gamemode_invasion.qc | 5 +++++ 7 files changed, 26 insertions(+), 11 deletions(-) diff --git a/qcsrc/common/monsters/sv_monsters.qc b/qcsrc/common/monsters/sv_monsters.qc index bf56a6245..1ca5eca61 100644 --- a/qcsrc/common/monsters/sv_monsters.qc +++ b/qcsrc/common/monsters/sv_monsters.qc @@ -980,7 +980,7 @@ float monster_initialize(float mon_id, float nodrop) entity mon = get_monsterinfo(mon_id); - if(mon.spawnflags & MON_FLAG_MUTATORBLOCKED) + if(mon.spawnflags & MON_FLAG_MUTATORBLOCKED && !(self.spawnflags & MONSTERFLAG_SPAWNED)) { dprint("Attempted to spawn a mutator-blocked monster rejected"); return FALSE; diff --git a/qcsrc/common/util.qh b/qcsrc/common/util.qh index d575bbfdd..6a16886df 100644 --- a/qcsrc/common/util.qh +++ b/qcsrc/common/util.qh @@ -208,7 +208,7 @@ float compressShotOrigin(vector v); vector decompressShotOrigin(float f); #ifdef SVQC -string rankings_reply, ladder_reply, lsmaps_reply, maplist_reply; // cached replies +string rankings_reply, ladder_reply, lsmaps_reply, maplist_reply, monsterlist_reply; // cached replies string records_reply[10]; #endif diff --git a/qcsrc/server/command/cmd.qc b/qcsrc/server/command/cmd.qc index 86cc80866..3d1015dfc 100644 --- a/qcsrc/server/command/cmd.qc +++ b/qcsrc/server/command/cmd.qc @@ -263,21 +263,14 @@ void ClientCommand_mobspawn(float request, float argc) if(tospawn == "list") { - float i; - string list = "Available monsters:"; - - for(i = MON_FIRST; i <= MON_LAST; ++i) - list = strcat(list, " ", (get_monsterinfo(i)).netname); - - sprint(self, strcat(list, "\n")); - + sprint(self, monsterlist_reply); return; } if(autocvar_g_monsters_max <= 0 || autocvar_g_monsters_max_perplayer <= 0) { sprint(self, "Monster spawning is disabled.\n"); } else if(!IS_PLAYER(self)) { sprint(self, "You can't spawn monsters while spectating.\n"); } else if(g_invasion) { sprint(self, "You can't spawn monsters during an invasion!\n"); } - else if not(autocvar_g_monsters) { Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_MONSTERS_DISABLED); } + else if(!autocvar_g_monsters) { Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_MONSTERS_DISABLED); } else if(self.vehicle) { sprint(self, "You can't spawn monsters while driving a vehicle.\n"); } else if(autocvar_g_campaign) { sprint(self, "You can't spawn monsters in campaign mode.\n"); } else if(self.deadflag != DEAD_NO) { sprint(self, "You can't spawn monsters while dead.\n"); } diff --git a/qcsrc/server/command/getreplies.qc b/qcsrc/server/command/getreplies.qc index 415d20f9c..ed6f69ad1 100644 --- a/qcsrc/server/command/getreplies.qc +++ b/qcsrc/server/command/getreplies.qc @@ -340,3 +340,18 @@ string getlsmaps() MapInfo_ClearTemps(); return sprintf("^7Maps available%s: %s\n", (newmaps ? " (New maps have asterisks marked in blue)" : ""), lsmaps); } + +string getmonsterlist() +{ + string monsterlist = "", col; + float i; + + for(i = MON_FIRST; i <= MON_LAST; ++i) + { + if(mod(i, 2)) { col = "^2"; } + else { col = "^3"; } + monsterlist = sprintf("%s%s%s ", monsterlist, col, (get_monsterinfo(i)).netname); + } + + return sprintf("^7Monsters available: %s\n", monsterlist); +} diff --git a/qcsrc/server/command/getreplies.qh b/qcsrc/server/command/getreplies.qh index 77da27219..583961d22 100644 --- a/qcsrc/server/command/getreplies.qh +++ b/qcsrc/server/command/getreplies.qh @@ -17,3 +17,4 @@ string getrankings(void); string getladder(void); string getmaplist(void); string getlsmaps(void); +string getmonsterlist(void); diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index 3b83d6e1e..a32cdaa0f 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -824,6 +824,7 @@ void spawnfunc_worldspawn (void) // set up information replies for clients and server to use maplist_reply = strzone(getmaplist()); lsmaps_reply = strzone(getlsmaps()); + monsterlist_reply = strzone(getmonsterlist()); for(i = 0; i < 10; ++i) { s = getrecords(i); diff --git a/qcsrc/server/mutators/gamemode_invasion.qc b/qcsrc/server/mutators/gamemode_invasion.qc index 1f55f776a..b93b44012 100644 --- a/qcsrc/server/mutators/gamemode_invasion.qc +++ b/qcsrc/server/mutators/gamemode_invasion.qc @@ -305,11 +305,16 @@ MUTATOR_DEFINITION(gamemode_invasion) MUTATOR_ONADD { + float i; + if(time > 1) // game loads at time 1 error("This is a game type and it cannot be added at runtime."); invasion_Initialize(); cvar_settemp("g_monsters", "1"); + + for(i = MON_FIRST; i <= MON_LAST; ++i) + get_monsterinfo(i).spawnflags &= ~MON_FLAG_MUTATORBLOCKED; } MUTATOR_ONROLLBACK_OR_REMOVE -- 2.39.2