From 3980184636a681ec7c3175d4574b0bf7ee7a62b2 Mon Sep 17 00:00:00 2001 From: Jakob MG Date: Thu, 16 Aug 2012 21:27:40 +0200 Subject: [PATCH] mutator_superspec (g_superspectate 1 to enable): Extended spectation fucntions. Currently supports followpowerup, followstrength and followstshield (uses cmd interface) --- qcsrc/server/cl_client.qc | 13 +- qcsrc/server/miscfunctions.qc | 4 +- qcsrc/server/mutators/mutator_superspec.qc | 131 +++++++++++++++++++++ qcsrc/server/mutators/mutators.qh | 1 + qcsrc/server/progs.src | 1 + 5 files changed, 145 insertions(+), 5 deletions(-) create mode 100644 qcsrc/server/mutators/mutator_superspec.qc diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 80159b85d..ec8edad65 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -2250,8 +2250,13 @@ entity CA_SpectateNext(entity start) { return other; } -float SpectateNext() { - other = find(self.enemy, classname, "player"); +float SpectateNext(entity _prefer) { + + if(_prefer) + other = _prefer; + else + other = find(self.enemy, classname, "player"); + if (g_ca && !autocvar_g_ca_spectate_enemies && self.caplayer) { // CA and ca players when spectating enemies is forbidden other = CA_SpectateNext(other); @@ -2465,7 +2470,7 @@ void ObserverThink() self.flags |= FL_SPAWNING; } else if(self.BUTTON_ATCK && !self.version_mismatch) { self.flags &~= FL_JUMPRELEASED; - if(SpectateNext() == 1) { + if(SpectateNext(world) == 1) { self.classname = "spectator"; } } else { @@ -2496,7 +2501,7 @@ void SpectatorThink() self.flags |= FL_SPAWNING; } else if(self.BUTTON_ATCK) { self.flags &~= FL_JUMPRELEASED; - if(SpectateNext() == 1) { + if(SpectateNext(world) == 1) { self.classname = "spectator"; } else { self.classname = "observer"; diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 70523892a..1e8cb45aa 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -1129,7 +1129,9 @@ void readlevelcvars(void) if(cvar("g_rocket_flying")) MUTATOR_ADD(mutator_rocketflying); if(cvar("g_vampire")) - MUTATOR_ADD(mutator_vampire); + MUTATOR_ADD(mutator_vampire); + if(cvar("g_superspectate")) + MUTATOR_ADD(mutator_superspec); } // is this a mutator? is this a mode? diff --git a/qcsrc/server/mutators/mutator_superspec.qc b/qcsrc/server/mutators/mutator_superspec.qc new file mode 100644 index 000000000..cb5a9c007 --- /dev/null +++ b/qcsrc/server/mutators/mutator_superspec.qc @@ -0,0 +1,131 @@ +MUTATOR_HOOKFUNCTION(superspec_PlayerPreThink) +{ + return FALSE; +} + +MUTATOR_HOOKFUNCTION(superspec_SV_ParseClientCommand) +{ + if(MUTATOR_RETURNVALUE) // command was already handled? + return FALSE; + + if(self.classname == "player") + { + centerprint(self, "GTFO\n"); + return TRUE; + } + + if(cmd_name == "followpowerup") + { + entity _player; + FOR_EACH_PLAYER(_player) + { + if(_player.strength_finished > time || _player.invincible_finished > time) + { + SpectateNext(_player); + //centerprint(self, "Active powerup found\n"); + return TRUE; + } + } + //centerprint(self, "No active powerups\n"); + return TRUE; + } + + if(cmd_name == "followstrength") + { + entity _player; + FOR_EACH_PLAYER(_player) + { + if(_player.strength_finished > time) + { + SpectateNext(_player); + //centerprint(self, "Active powerup found\n"); + return TRUE; + } + } + //centerprint(self, "No active powerups\n"); + return TRUE; + } + + if(cmd_name == "followstshield") + { + entity _player; + FOR_EACH_PLAYER(_player) + { + if(_player.invincible_finished > time) + { + SpectateNext(_player); + //centerprint(self, "Active powerup found\n"); + return TRUE; + } + } + //centerprint(self, "No active powerups\n"); + return TRUE; + } + + /* + { + if(cmd_argc == 2) + { + if(argv(1) == "bar") + + else if(argv(1) == "baz") + + else + { + float _idx = stof(argv(1)); + + } + } + + return TRUE; + } + */ + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(superspec_BuildMutatorsString) +{ + ret_string = strcat(ret_string, ":SS"); + return 0; +} + +MUTATOR_HOOKFUNCTION(superspec_BuildMutatorsPrettyString) +{ + ret_string = strcat(ret_string, ", Super Spectators"); + return 0; +} + +MUTATOR_HOOKFUNCTION(superspec_PlayerSpawn) +{ + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(superspec_ClientDisconnect) +{ + + return FALSE; +} + +MUTATOR_DEFINITION(mutator_superspec) +{ + + MUTATOR_HOOK(BuildMutatorsString, superspec_BuildMutatorsString, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsPrettyString, superspec_BuildMutatorsPrettyString, CBC_ORDER_ANY); + MUTATOR_HOOK(SV_ParseClientCommand, superspec_SV_ParseClientCommand, CBC_ORDER_ANY); + //MUTATOR_HOOK(ClientConnect, superspec_ClientConnect, CBC_ORDER_ANY); + //MUTATOR_HOOK(PlayerSpawn, superspec_PlayerSpawn, CBC_ORDER_ANY); + //MUTATOR_HOOK(PlayerPreThink, superspec_PlayerPreThink, CBC_ORDER_ANY); + //MUTATOR_HOOK(ClientDisconnect, superspec_ClientDisconnect, CBC_ORDER_ANY); + + MUTATOR_ONADD + { + } + + MUTATOR_ONREMOVE + { + } + + return 0; +} diff --git a/qcsrc/server/mutators/mutators.qh b/qcsrc/server/mutators/mutators.qh index 8ba7320f2..61c2b896a 100644 --- a/qcsrc/server/mutators/mutators.qh +++ b/qcsrc/server/mutators/mutators.qh @@ -11,5 +11,6 @@ MUTATOR_DECLARATION(mutator_nix); MUTATOR_DECLARATION(mutator_rocketflying); MUTATOR_DECLARATION(mutator_spawn_near_teammate); MUTATOR_DECLARATION(mutator_vampire); +MUTATOR_DECLARATION(mutator_superspec); MUTATOR_DECLARATION(sandbox); diff --git a/qcsrc/server/progs.src b/qcsrc/server/progs.src index 4dde8f22b..b58f5d532 100644 --- a/qcsrc/server/progs.src +++ b/qcsrc/server/progs.src @@ -218,6 +218,7 @@ mutators/mutator_rocketflying.qc mutators/mutator_vampire.qc mutators/mutator_spawn_near_teammate.qc mutators/sandbox.qc +mutators/mutator_superspec.qc ../warpzonelib/anglestransform.qc ../warpzonelib/mathlib.qc -- 2.39.2