Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
getreplies.qc File Reference
Include dependency graph for getreplies.qc:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void GetCvars (entity this, entity store, int f)
void GetCvars_handleFloat (entity this, entity store, string thisname, float f,.float field, string name)
void GetCvars_handleFloatOnce (entity this, entity store, string thisname, float f,.float field, string name)
void GetCvars_handleString (entity this, entity store, string thisname, float f,.string field, string name)
void GetCvars_handleString_Fixup (entity this, entity store, string thisname, float f,.string field, string name, string(entity, string) func)
string getladder ()
string getlsmaps ()
string getmaplist ()
string getmonsterlist ()
string getrankings ()
string getrecords (int page)

Variables

const int LSMAPS_MAX = 250

Function Documentation

◆ GetCvars()

void GetCvars ( entity this,
entity store,
int f )
Parameters
f-1: cleanup, 0: request, 1: receive

Definition at line 387 of file getreplies.qc.

388{
389 string s = string_null;
390
391 if (f == 0)
392 LOG_INFO("Warning: requesting cvar values is deprecated. Client should send them automatically using REPLICATE.\n");
393
394 if (f > 0)
395 s = strcat(argv(f));
396
397 get_cvars_f = f;
398 get_cvars_s = s;
400
401 Notification_GetCvars(this, store);
402
403 ReplicateVars(this, store, s, f);
404 if (f > 0)
405 ReplicateVars_ApplyChange(this, store, s, f);
406}
#define MUTATOR_CALLHOOK(id,...)
Definition base.qh:143
void GetCvars(entity this, entity store, int f)
ACCUMULATE void ReplicateVars_ApplyChange(entity this, entity store, string thisname, int i)
Definition replicate.qh:28
#define LOG_INFO(...)
Definition log.qh:62
string argv(float n)
string string_null
Definition nil.qh:9
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
void Notification_GetCvars(entity this, entity store)
Used by MSG_CHOICE to build list of choices.
Definition all.qc:707
void ReplicateVars(bool would_destroy)
Definition all.qh:884
float get_cvars_f
Definition events.qh:346
string get_cvars_s
Definition events.qh:347

References argv(), entity(), get_cvars_f, get_cvars_s, GetCvars(), LOG_INFO, MUTATOR_CALLHOOK, Notification_GetCvars(), ReplicateVars(), ReplicateVars_ApplyChange(), strcat(), and string_null.

Referenced by ClientCommand_sentcvar(), ClientState_detach(), GetCvars(), and MUTATOR_HOOKABLE().

◆ GetCvars_handleFloat()

void GetCvars_handleFloat ( entity this,
entity store,
string thisname,
float f,
.float field,
string name )

Definition at line 347 of file getreplies.qc.

348{
349 if (f < 0)
350 {
351 }
352 else if (f > 0)
353 {
354 if (thisname == name)
355 store.(field) = stof(argv(f + 1));
356 }
357 else
358 stuffcmd(this, strcat("cl_cmd sendcvar ", name, "\n"));
359}
string name
Definition menu.qh:30
float stof(string val,...)
#define stuffcmd(cl,...)
Definition progsdefs.qh:23

References argv(), entity(), name, stof(), strcat(), and stuffcmd.

Referenced by Notification_GetCvars().

◆ GetCvars_handleFloatOnce()

void GetCvars_handleFloatOnce ( entity this,
entity store,
string thisname,
float f,
.float field,
string name )

Definition at line 360 of file getreplies.qc.

361{
362 if (f < 0)
363 {
364 }
365 else if (f > 0)
366 {
367 if (thisname == name)
368 {
369 if (!store.(field))
370 {
371 store.(field) = stof(argv(f + 1));
372 if (!store.(field))
373 store.(field) = -1;
374 }
375 }
376 }
377 else
378 {
379 if (!store.(field))
380 stuffcmd(this, strcat("cl_cmd sendcvar ", name, "\n"));
381 }
382}

References argv(), entity(), name, stof(), strcat(), and stuffcmd.

◆ GetCvars_handleString()

void GetCvars_handleString ( entity this,
entity store,
string thisname,
float f,
.string field,
string name )

Definition at line 318 of file getreplies.qc.

319{
320 if (f < 0)
321 {
322 strfree(store.(field));
323 }
324 else if (f > 0)
325 {
326 if (thisname == name)
327 {
328 strcpy(store.(field), argv(f + 1));
329 }
330 }
331 else
332 stuffcmd(this, strcat("cl_cmd sendcvar ", name, "\n"));
333}
#define strfree(this)
Definition string.qh:57
#define strcpy(this, s)
Definition string.qh:51

References argv(), entity(), name, strcat(), strcpy, strfree, and stuffcmd.

Referenced by GetCvars_handleString_Fixup().

◆ GetCvars_handleString_Fixup()

void GetCvars_handleString_Fixup ( entity this,
entity store,
string thisname,
float f,
.string field,
string name,
string(entity, string) func )

Definition at line 334 of file getreplies.qc.

335{
336 GetCvars_handleString(this, store, thisname, f, field, name);
337 if (f >= 0) // also initialize to the fitting value for "" when sending cvars out
338 if (thisname == name)
339 {
340 string s = func(this, strcat(store.(field)));
341 if (s != store.(field))
342 {
343 strcpy(store.(field), s);
344 }
345 }
346}
void GetCvars_handleString(entity this, entity store, string thisname, float f,.string field, string name)

References entity(), GetCvars_handleString(), name, strcat(), and strcpy.

◆ getladder()

string getladder ( )

Definition at line 71 of file getreplies.qc.

72{
73 int i, j, k, uidcnt = 0, thiscnt;
74 string s, temp_s, rr, myuid, thisuid;
75
76 rr = (g_cts) ? CTS_RECORD : RACE_RECORD;
77
78 for (k = 0; k < MapInfo_count; ++k)
79 {
80 if (MapInfo_Get_ByID(k))
81 {
82 for (i = 0; i <= LADDER_CNT; ++i) // i = 0 because it is the speed award
83 {
84 if (i == 0) // speed award
85 {
86 if (stof(db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, rr, "speed/speed"))) == 0) continue;
87
88 myuid = db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, rr, "speed/crypto_idfp"));
89 }
90 else // normal record, if it exists (else break)
91 {
92 if (race_readTime(MapInfo_Map_bspname, i) == 0) continue;
93
95 }
96
97 // string s contains:
98 // arg 0 = # of speed recs
99 // arg 1 = # of 1st place recs
100 // arg 2 = # of 2nd place recs
101 // ... etc
102 // LADDER_CNT+1 = total points
103
104 temp_s = db_get(TemporaryDB, strcat("ladder", myuid));
105
106 if (temp_s == "")
107 {
108 db_put(TemporaryDB, strcat("uid", ftos(uidcnt)), myuid);
109 ++uidcnt;
110
111 for (j = 0; j <= LADDER_CNT + 1; ++j)
112 {
113 if (j != LADDER_CNT + 1) temp_s = strcat(temp_s, "0 ");
114 else temp_s = strcat(temp_s, "0");
115 }
116 }
117
118 tokenize_console(temp_s);
119 s = "";
120
121 if (i == 0) // speed award
122 {
123 for (j = 0; j <= LADDER_CNT; ++j) // loop over each arg in the string
124 {
125 if (j == 0) // speed award
126 s = strcat(s, ftos(stof(argv(j)) + 1)); // add 1 to speed rec count and write
127 else s = strcat(s, " ", argv(j)); // just copy over everything else
128 }
129 }
130 else // record
131 {
132 for (j = 0; j <= LADDER_CNT; ++j) // loop over each arg in the string
133 {
134 if (j == 0) s = strcat(s, argv(j)); // speed award, dont prefix with " "
135 else if (j == i) // wanted rec!
136 s = strcat(s, " ", ftos(stof(argv(j)) + 1)); // update argv(j)
137 else s = strcat(s, " ", argv(j)); // just copy over everything else
138 }
139 }
140
141 // total points are (by default) calculated like this:
142 // speedrec = floor(100 / 10) = 10 points
143 // 1st place = floor(100 / 1) = 100 points
144 // 2nd place = floor(100 / 2) = 50 points
145 // 3rd place = floor(100 / 3) = 33 points
146 // 4th place = floor(100 / 4) = 25 points
147 // 5th place = floor(100 / 5) = 20 points
148 // ... etc
149
150 if (i == 0) s = strcat(s, " ", ftos(stof(argv(LADDER_CNT + 1)) + LADDER_FIRSTPOINT / 10)); // speed award, add LADDER_FIRSTPOINT / 10 points
151 else s = strcat(s, " ", ftos(stof(argv(LADDER_CNT + 1)) + floor(LADDER_FIRSTPOINT / i))); // record, add LADDER_FIRSTPOINT / i points
152
153 db_put(TemporaryDB, strcat("ladder", myuid), s);
154 }
155 }
156 }
157
158 for (i = 0; i <= uidcnt; ++i) // for each known uid
159 {
160 thisuid = db_get(TemporaryDB, strcat("uid", ftos(i)));
161 temp_s = db_get(TemporaryDB, strcat("ladder", thisuid));
162 tokenize_console(temp_s);
163 thiscnt = stof(argv(LADDER_CNT + 1));
164
165 if (thiscnt > top_scores[LADDER_SIZE - 1])
166 {
167 for (j = 0; j < LADDER_SIZE; ++j) // for each place in ladder
168 {
169 if (thiscnt > top_scores[j])
170 {
171 for (k = LADDER_SIZE - 1; k >= j; --k)
172 {
173 top_uids[k] = top_uids[k - 1];
174 top_scores[k] = top_scores[k - 1];
175 }
176
177 top_uids[j] = thisuid;
178 top_scores[j] = thiscnt;
179 break;
180 }
181 }
182 }
183 }
184
185 s = "^3-----------------------\n\n";
186
187 s = strcat(s, "Pos ^3|");
188 s = strcat(s, " ^7Total ^3|");
189
190 for (i = 1; i <= LADDER_CNT; ++i)
191 s = strcat(s, " ^7", count_ordinal(i), " ^3|");
192 s = strcat(s, " ^7Speed awards ^3| ^7Name");
193 s = strcat(s, "\n^3----+--------");
194
195 for (i = 1; i <= min(9, LADDER_CNT); ++i)
196 s = strcat(s, "+-----");
197#if LADDER_CNT > 9
198 for (i = 1; i <= LADDER_CNT - 9; ++i)
199 s = strcat(s, "+------");
200#endif
201
202 s = strcat(s, "+--------------+--------------------\n");
203
204 for (i = 0; i < LADDER_SIZE; ++i)
205 {
206 temp_s = db_get(TemporaryDB, strcat("ladder", top_uids[i]));
207 tokenize_console(temp_s);
208
209 if (argv(LADDER_CNT + 1) == "") // total is 0, skip
210 continue;
211
212 s = strcat(s, strpad(4, count_ordinal(i + 1)), "^3| ^7"); // pos
213 s = strcat(s, strpad(7, argv(LADDER_CNT + 1)), "^3| ^7"); // total
214
215 for (j = 1; j <= min(9, LADDER_CNT); ++j)
216 s = strcat(s, strpad(4, argv(j)), "^3| ^7"); // 1st, 2nd, 3rd etc cnt
217
218#if LADDER_CNT > 9
219 for (j = 10; j <= LADDER_CNT; ++j)
220 s = strcat(s, strpad(4, argv(j)), " ^3| ^7"); // 1st, 2nd, 3rd etc cnt
221#endif
222
223 s = strcat(s, strpad(13, argv(0)), "^3| ^7"); // speed award cnt
224 s = strcat(s, uid2name(top_uids[i]), "\n"); // name
225 }
226
228
229 if (s == "") return "No ladder on this server!\n";
230 else return strcat("Top ", ftos(LADDER_SIZE), " ladder rankings:\n", s);
231}
#define CTS_RECORD
Definition util.qh:98
#define RACE_RECORD
Definition util.qh:97
ERASEABLE string count_ordinal(int interval)
Definition counting.qh:66
#define g_cts
Definition cts.qh:36
#define tokenize_console
const int LADDER_FIRSTPOINT
Definition getreplies.qh:9
float top_scores[LADDER_SIZE]
Definition getreplies.qh:14
const int LADDER_SIZE
Definition getreplies.qh:11
#define LADDER_CNT
Definition getreplies.qh:10
string top_uids[LADDER_SIZE]
Definition getreplies.qh:13
ERASEABLE string db_get(int db, string key)
Definition map.qh:93
ERASEABLE void db_put(int db, string key, string value)
Definition map.qh:103
bool MapInfo_Get_ByID(int i)
Definition mapinfo.qc:274
void MapInfo_ClearTemps()
Definition mapinfo.qc:1630
float MapInfo_count
Definition mapinfo.qh:166
string MapInfo_Map_bspname
Definition mapinfo.qh:6
float min(float f,...)
string ftos(float f)
float floor(float f)
float race_readTime(string map, float pos)
Definition race.qc:69
string uid2name(string myuid)
Definition race.qc:36
string race_readUID(string map, float pos)
Definition race.qc:74
float TemporaryDB
Definition world.qh:129
float ServerProgsDB
Definition world.qh:128

References argv(), count_ordinal(), CTS_RECORD, db_get(), db_put(), floor(), ftos(), g_cts, LADDER_CNT, LADDER_FIRSTPOINT, LADDER_SIZE, MapInfo_ClearTemps(), MapInfo_count, MapInfo_Get_ByID(), MapInfo_Map_bspname, min(), race_readTime(), race_readUID(), RACE_RECORD, ServerProgsDB, stof(), strcat(), TemporaryDB, tokenize_console, top_scores, top_uids, and uid2name().

Referenced by spawnfunc().

◆ getlsmaps()

string getlsmaps ( )

Definition at line 252 of file getreplies.qc.

253{
254 string lsmaps = "", col;
255 bool newmaps = false;
256 int added = 0;
257
258 for (int i = 0; i < MapInfo_count; ++i)
259 {
261 {
262 ++added;
263
264 if(added > LSMAPS_MAX)
265 continue; // we still get the added count, but skip the actual processing
266
267 // todo: Check by play count of maps for other gametypes?
268 // TODO: standardized system for adding new map clause
269 bool isnewmap = false;
271 isnewmap = true;
272 else if(g_ctf && !stof(db_get(ServerProgsDB, strcat(MapInfo_Map_bspname, "/captimerecord/time"))))
273 isnewmap = true;
274
275 if(isnewmap)
276 {
277 newmaps = true;
278 if (i % 2) col = "^4*"; else col = "^5*";
279 }
280 else
281 {
282 if (i % 2) col = "^2"; else col = "^3";
283 }
284
285 lsmaps = cons(lsmaps, strcat(col, MapInfo_Map_bspname));
286 }
287 }
288
289 if(added > LSMAPS_MAX)
290 lsmaps = sprintf("%s ^7(%d not listed)", lsmaps, added - LSMAPS_MAX);
291
293 return sprintf("^7Maps available (%d)%s: %s\n", added, (newmaps ? " (New maps have asterisks marked in blue)" : ""), lsmaps);
294}
#define g_race
Definition race.qh:48
#define g_ctf
Definition ctf.qh:38
const int LSMAPS_MAX
int MapInfo_ForbiddenFlags()
Definition mapinfo.qc:1655
int MapInfo_Map_flags
Definition mapinfo.qh:15
ERASEABLE string cons(string a, string b)
Definition string.qh:277

References cons(), db_get(), g_ctf, g_cts, g_race, LSMAPS_MAX, MapInfo_ClearTemps(), MapInfo_count, MapInfo_ForbiddenFlags(), MapInfo_Get_ByID(), MapInfo_Map_bspname, MapInfo_Map_flags, race_readTime(), ServerProgsDB, stof(), and strcat().

Referenced by GameTypeVote_SetGametype(), and spawnfunc().

◆ getmaplist()

string getmaplist ( )

Definition at line 233 of file getreplies.qc.

234{
235 if(autocvar_g_maplist == "")
236 return "^7Map list is empty";
237
238 string maplist = "";
239 int mapcount = 0;
241 {
242 string col = (i % 2) ? "^2" : "^3";
243 maplist = cons(maplist, strcat(col, it));
244 ++mapcount;
245 });
246
248 return sprintf("^7Maps in list (%d): %s\n", mapcount, maplist);
249}
#define FOREACH_WORD(words, cond, body)
Definition iter.qh:33
float MapInfo_CheckMap(string s)
Definition mapinfo.qc:1502
#define autocvar_g_maplist
Definition mapvoting.qh:3

References autocvar_g_maplist, cons(), FOREACH_WORD, MapInfo_CheckMap(), MapInfo_ClearTemps(), and strcat().

Referenced by spawnfunc().

◆ getmonsterlist()

string getmonsterlist ( )

Definition at line 296 of file getreplies.qc.

297{
298 string monsterlist = "";
299
300 FOREACH(Monsters, it != MON_Null && !(it.spawnflags & MON_FLAG_HIDDEN),
301 {
302 string col = ((i % 2) ? "^2" : "^3");
303 monsterlist = sprintf("%s%s%s ", monsterlist, col, it.netname);
304 });
305
306 return sprintf("^7Monsters available: %s\n", monsterlist);
307}
#define FOREACH(list, cond, body)
Definition iter.qh:19
const int MON_FLAG_HIDDEN
Definition monster.qh:17

References FOREACH, and MON_FLAG_HIDDEN.

Referenced by spawnfunc().

◆ getrankings()

string getrankings ( )

Definition at line 46 of file getreplies.qc.

47{
48 float t, i;
49 string n, s, p, map;
50
51 map = GetMapname();
52
53 s = "";
54 for (i = 1; i <= RANKINGS_CNT; ++i)
55 {
56 t = race_readTime(map, i);
57
58 if (t == 0) continue;
59
60 n = race_readName(map, i);
61 p = count_ordinal(i);
62 s = strcat(s, strpad(8, p), " ", strpad(-8, TIME_ENCODED_TOSTRING(t, false)), " ", n, "\n");
63 }
64
66
67 if (s == "") return strcat("No records are available for the map: ", map, "\n");
68 else return strcat("Records for ", map, ":\n", s);
69}
#define TIME_ENCODED_TOSTRING(n, compact)
Definition util.qh:96
const int RANKINGS_CNT
Definition constants.qh:31
string GetMapname()
string race_readName(string map, float pos)
Definition race.qc:128

References count_ordinal(), GetMapname(), MapInfo_ClearTemps(), race_readName(), race_readTime(), RANKINGS_CNT, strcat(), and TIME_ENCODED_TOSTRING.

Referenced by race_deleteTime(), race_setTime(), and spawnfunc().

◆ getrecords()

string getrecords ( int page)

Definition at line 35 of file getreplies.qc.

36{
37 string s = "";
38
39 MUTATOR_CALLHOOK(GetRecords, page, s);
40 s = M_ARGV(1, string);
41
43 return s;
44}
#define M_ARGV(x, type)
Definition events.qh:17

References M_ARGV, MapInfo_ClearTemps(), and MUTATOR_CALLHOOK.

Referenced by spawnfunc().

Variable Documentation

◆ LSMAPS_MAX

const int LSMAPS_MAX = 250

Definition at line 251 of file getreplies.qc.

Referenced by getlsmaps().