5 #define ASF_FLAG_GRAB 16
6 #define ASF_ALL 0xFFFFFF
10 float _spectate(entity _player)
12 if(SpectateNext(_player) == 1)
14 PutObserverInServer();
15 self.classname = "spectator";
21 MUTATOR_HOOKFUNCTION(superspec_ItemTouch)
23 entity _oldself = self;
28 //centerprint(self, sprintf("Player %s^7 just grabbed a ^3%s\n", other.netname, _item.classname));
30 if( (self.autospec_flags & ASF_SHIELD && _item.invincible_finished) ||
31 (self.autospec_flags & ASF_STRENGTH && _item.strength_finished) ||
32 (self.autospec_flags & ASF_MEGA_AR && _item.classname == "item_armor_large") ||
33 (self.autospec_flags & ASF_MEGA_HP && _item.classname == "item_health_mega") )
42 MUTATOR_HOOKFUNCTION(superspec_SV_ParseClientCommand)
44 if(MUTATOR_RETURNVALUE) // command was already handled?
47 if(self.classname == "player")
50 if(cmd_name == "autospec")
54 #define STRING2FLAG(str,flg) if(argv(i) == str) _bits |= flg
55 float i, _bits, _start = 1;
56 if(argv(1) == "clear")
58 self.autospec_flags = 0;
62 for(i = _start; i < cmd_argc; ++i)
64 if(argv(i) == "on" || argv(i) == "1")ยง
66 self.autospec_flags |= _bits;
69 else if(argv(i) == "off" || argv(i) == "0")
72 self.autospec_flags &~= _bits;
78 STRING2FLAG("strength", ASF_STRENGTH);
79 STRING2FLAG("shield", ASF_SHIELD);
80 STRING2FLAG("mega_health", ASF_MEGA_HP);
81 STRING2FLAG("mega_armor", ASF_MEGA_AR);
82 STRING2FLAG("all", ASF_ALL);
87 string _aspeco = "^3Current auto spectate options are:\n\n\n\n\n";
90 #define SPECOCLR(var,test,text) \
91 var = strcat(var, ((self.autospec_flags & test) ? "^2" : "^1")); \
92 var = strcat(var,text)
94 SPECOCLR(_aspeco, ASF_STRENGTH, "Strength\n\n");
95 SPECOCLR(_aspeco, ASF_SHIELD, "Shiled\n\n");
96 SPECOCLR(_aspeco, ASF_MEGA_HP, "Mega Health\n\n");
97 SPECOCLR(_aspeco, ASF_MEGA_AR, "Mega Armor\n\n");
100 centerprint(self, _aspeco);
104 if(cmd_name == "followpowerup")
107 FOR_EACH_PLAYER(_player)
109 if(_player.strength_finished > time || _player.invincible_finished > time)
110 return _spectate(_player);
113 centerprint(self, "No active powerups\n");
117 if(cmd_name == "followstrength")
120 FOR_EACH_PLAYER(_player)
122 if(_player.strength_finished > time)
123 return _spectate(_player);
126 centerprint(self, "No active Strength\n");
130 if(cmd_name == "followstshield")
133 FOR_EACH_PLAYER(_player)
135 if(_player.invincible_finished > time)
136 return _spectate(_player);
139 centerprint(self, "No active Shield\n");
143 if(cmd_name == "followfc")
159 FOR_EACH_PLAYER(_player)
161 if(_player.flagcarried && (_player.team == _team || _team == 0))
162 return _spectate(_player);
165 centerprint(self, "No active flag carrier\n");
172 MUTATOR_HOOKFUNCTION(superspec_BuildMutatorsString)
174 ret_string = strcat(ret_string, ":SS");
178 MUTATOR_HOOKFUNCTION(superspec_BuildMutatorsPrettyString)
180 ret_string = strcat(ret_string, ", Super Spectators");
185 MUTATOR_HOOKFUNCTION(superspec_PlayerSpawn)
191 MUTATOR_HOOKFUNCTION(superspec_ClientDisconnect)
196 MUTATOR_HOOKFUNCTION(superspec_PlayerPreThink)
202 MUTATOR_DEFINITION(mutator_superspec)
205 MUTATOR_HOOK(BuildMutatorsString, superspec_BuildMutatorsString, CBC_ORDER_ANY);
206 MUTATOR_HOOK(BuildMutatorsPrettyString, superspec_BuildMutatorsPrettyString, CBC_ORDER_ANY);
207 MUTATOR_HOOK(SV_ParseClientCommand, superspec_SV_ParseClientCommand, CBC_ORDER_ANY);
208 MUTATOR_HOOK(ItemTouch, superspec_ItemTouch, CBC_ORDER_ANY);
209 //MUTATOR_HOOK(ClientConnect, superspec_ClientConnect, CBC_ORDER_ANY);
210 //MUTATOR_HOOK(PlayerSpawn, superspec_PlayerSpawn, CBC_ORDER_ANY);
211 //MUTATOR_HOOK(PlayerPreThink, superspec_PlayerPreThink, CBC_ORDER_ANY);
212 //MUTATOR_HOOK(ClientDisconnect, superspec_ClientDisconnect, CBC_ORDER_ANY);