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