]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/mutators/mutator_superspec.qc
Dewopsyfy the dewopsyfication
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator_superspec.qc
1 #define ASF_STRENGTH 1
2 #define ASF_SHIELD 2
3 #define ASF_MEGA_AR 4
4 #define ASF_MEGA_HP 8
5 #define ASF_FLAG_GRAB 16
6 #define ASF_ALL 0xFFFFFF
7
8 .float autospec_flags;
9
10 float _spectate(entity _player)
11 {
12         if(SpectateNext(_player) == 1)
13         {
14                 PutObserverInServer();
15                 self.classname = "spectator";
16         }
17         
18         return TRUE;
19 }
20
21 MUTATOR_HOOKFUNCTION(superspec_ItemTouch)
22 {
23         entity _oldself = self;
24         entity _item = self;
25         
26         FOR_EACH_SPEC(self)
27         {
28                 //centerprint(self, sprintf("Player %s^7 just grabbed a ^3%s\n", other.netname, _item.classname));
29                 
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") )          
34                                 _spectate(other);
35         }
36         
37         self = _oldself;
38         
39         return FALSE;
40 }
41
42 MUTATOR_HOOKFUNCTION(superspec_SV_ParseClientCommand)
43 {
44         if(MUTATOR_RETURNVALUE) // command was already handled?
45                 return FALSE;
46
47         if(self.classname == "player")
48                 return FALSE;
49
50         if(cmd_name == "autospec")
51         {
52                 if(cmd_argc > 1)
53                 {
54 #define STRING2FLAG(str,flg) if(argv(i) == str) _bits |= flg
55                         float i, _bits, _start = 1;
56                         if(argv(1) == "clear")
57                         {
58                                 self.autospec_flags = 0;
59                                 _start = 2;
60                         }
61
62                         for(i = _start; i < cmd_argc; ++i)
63                         {
64                                 if(argv(i) == "on" || argv(i) == "1")ยง
65                                 {
66                                         self.autospec_flags |= _bits;
67                                         _bits = 0;
68                                 }
69                                 else if(argv(i) == "off" || argv(i) == "0")
70                                 {
71                                         if(_start == 1)
72                                                 self.autospec_flags &~= _bits;
73
74                                         _bits = 0;
75                                 }
76                                 else
77                                 {
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);
83                                 }
84                         }
85                 }
86                 
87                 string _aspeco = "^3Current auto spectate options are:\n\n\n\n\n";
88 #undef STRING2FLAG
89
90 #define SPECOCLR(var,test,text) \
91     var = strcat(var, ((self.autospec_flags & test) ? "^2" : "^1")); \
92     var = strcat(var,text)
93
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");
98 #undef SPECOCLR
99
100                 centerprint(self, _aspeco);
101                 return TRUE;dfd
102         }
103         
104         if(cmd_name == "followpowerup")
105         {
106                 entity _player;
107                 FOR_EACH_PLAYER(_player)
108                 {
109                         if(_player.strength_finished > time || _player.invincible_finished > time)
110                                 return _spectate(_player);
111                 }
112                 
113                 centerprint(self, "No active powerups\n");
114                 return TRUE;
115         }
116
117         if(cmd_name == "followstrength")
118         {
119                 entity _player;
120                 FOR_EACH_PLAYER(_player)
121                 {
122                         if(_player.strength_finished > time)
123                                 return _spectate(_player);
124                 }
125                 
126                 centerprint(self, "No active Strength\n");
127                 return TRUE;
128         }
129
130         if(cmd_name == "followstshield")
131         {
132                 entity _player;
133                 FOR_EACH_PLAYER(_player)
134                 {
135                         if(_player.invincible_finished > time)
136                                 return _spectate(_player);
137                 }
138                 
139                 centerprint(self, "No active Shield\n");
140                 return TRUE;
141         }
142
143         if(cmd_name == "followfc")
144         {
145                 if(!g_ctf)
146                         return TRUE;
147                 
148                 entity _player;         
149                 float _team;
150                 
151                 if(cmd_argc == 2)
152                 {                       
153                         if(argv(1) == "red")
154                                 _team = COLOR_TEAM1;
155                         else
156                                 _team = COLOR_TEAM2;
157                 }
158                 
159                 FOR_EACH_PLAYER(_player)
160                 {
161                         if(_player.flagcarried && (_player.team == _team || _team == 0))
162                                 return _spectate(_player);
163                 }
164                 
165                 centerprint(self, "No active flag carrier\n");
166                 return TRUE;
167         }       
168
169         return FALSE;
170 }
171
172 MUTATOR_HOOKFUNCTION(superspec_BuildMutatorsString)
173 {
174         ret_string = strcat(ret_string, ":SS");
175         return 0;
176 }
177
178 MUTATOR_HOOKFUNCTION(superspec_BuildMutatorsPrettyString)
179 {
180         ret_string = strcat(ret_string, ", Super Spectators");
181         return 0;
182 }
183
184 /*
185 MUTATOR_HOOKFUNCTION(superspec_PlayerSpawn)
186 {
187
188         return FALSE;
189 }
190
191 MUTATOR_HOOKFUNCTION(superspec_ClientDisconnect)
192 {
193
194         return FALSE;
195 }
196 MUTATOR_HOOKFUNCTION(superspec_PlayerPreThink)
197 {
198         return FALSE;
199 }
200 */
201
202 MUTATOR_DEFINITION(mutator_superspec)
203 {
204
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);
213
214         MUTATOR_ONADD
215         {
216         }
217
218         MUTATOR_ONREMOVE
219         {
220         }
221
222         return 0;
223 }