summaryrefslogtreecommitdiff
path: root/src/fpsgame/extinfo.h
diff options
context:
space:
mode:
authorxolatile2025-07-16 23:07:43 +0200
committerxolatile2025-07-16 23:07:43 +0200
commit7256502afa0babe60fcafbd2888cd3e33c3f9b6b (patch)
tree8a8495662a69bdadc4b5d9152656b9f02a44d668 /src/fpsgame/extinfo.h
parentbc596ac9d4cdd00abf537b88d3c544be161330cc (diff)
downloadxolatile-badassbug-7256502afa0babe60fcafbd2888cd3e33c3f9b6b.tar.xz
xolatile-badassbug-7256502afa0babe60fcafbd2888cd3e33c3f9b6b.tar.zst
Source code, broken...
Diffstat (limited to 'src/fpsgame/extinfo.h')
-rw-r--r--src/fpsgame/extinfo.h145
1 files changed, 145 insertions, 0 deletions
diff --git a/src/fpsgame/extinfo.h b/src/fpsgame/extinfo.h
new file mode 100644
index 0000000..0e747e7
--- /dev/null
+++ b/src/fpsgame/extinfo.h
@@ -0,0 +1,145 @@
+
+#define EXT_ACK -1
+#define EXT_VERSION 105
+#define EXT_NO_ERROR 0
+#define EXT_ERROR 1
+#define EXT_PLAYERSTATS_RESP_IDS -10
+#define EXT_PLAYERSTATS_RESP_STATS -11
+#define EXT_UPTIME 0
+#define EXT_PLAYERSTATS 1
+#define EXT_TEAMSCORE 2
+
+/*
+ Client:
+ -----
+ A: 0 EXT_UPTIME
+ B: 0 EXT_PLAYERSTATS cn #a client number or -1 for all players#
+ C: 0 EXT_TEAMSCORE
+
+ Server:
+ --------
+ A: 0 EXT_UPTIME EXT_ACK EXT_VERSION uptime #in seconds#
+ B: 0 EXT_PLAYERSTATS cn #send by client# EXT_ACK EXT_VERSION 0 or 1 #error, if cn was > -1 and client does not exist# ...
+ EXT_PLAYERSTATS_RESP_IDS pid(s) #1 packet#
+ EXT_PLAYERSTATS_RESP_STATS pid playerdata #1 packet for each player#
+ C: 0 EXT_TEAMSCORE EXT_ACK EXT_VERSION 0 or 1 #error, no teammode# remaining_time gamemode loop(teamdata [numbases bases] or -1)
+
+ Errors:
+ --------------
+ B:C:default: 0 command EXT_ACK EXT_VERSION EXT_ERROR
+*/
+
+ VAR(extinfoip, 0, 0, 1);
+
+ void extinfoplayer(ucharbuf &p, clientinfo *ci)
+ {
+ ucharbuf q = p;
+ putint(q, EXT_PLAYERSTATS_RESP_STATS); // send player stats following
+ putint(q, ci->clientnum); //add player id
+ putint(q, ci->ping);
+ sendstring(ci->name, q);
+ sendstring(ci->team, q);
+ putint(q, ci->state.frags);
+ putint(q, ci->state.flags);
+ putint(q, ci->state.deaths);
+ putint(q, ci->state.teamkills);
+ putint(q, ci->state.damage*100/max(ci->state.shotdamage,1));
+ putint(q, ci->state.health);
+ putint(q, ci->state.armour);
+ putint(q, ci->state.gunselect);
+ putint(q, ci->privilege);
+ putint(q, ci->state.state);
+ uint ip = extinfoip ? getclientip(ci->clientnum) : 0;
+ q.put((uchar*)&ip, 3);
+ sendserverinforeply(q);
+ }
+
+ static inline void extinfoteamscore(ucharbuf &p, const char *team, int score)
+ {
+ sendstring(team, p);
+ putint(p, score);
+ if(!smode || !smode->extinfoteam(team, p))
+ putint(p,-1); //no bases follow
+ }
+
+ void extinfoteams(ucharbuf &p)
+ {
+ putint(p, m_teammode ? 0 : 1);
+ putint(p, gamemode);
+ putint(p, max((gamelimit - gamemillis)/1000, 0));
+ if(!m_teammode) return;
+
+ vector<teamscore> scores;
+ if(smode && smode->hidefrags()) smode->getteamscores(scores);
+ loopv(clients)
+ {
+ clientinfo *ci = clients[i];
+ if(ci->state.state!=CS_SPECTATOR && ci->team[0] && scores.htfind(ci->team) < 0)
+ {
+ if(smode && smode->hidefrags()) scores.add(teamscore(ci->team, 0));
+ else { teaminfo *ti = teaminfos.access(ci->team); scores.add(teamscore(ci->team, ti ? ti->frags : 0)); }
+ }
+ }
+ loopv(scores) extinfoteamscore(p, scores[i].team, scores[i].score);
+ }
+
+ void extserverinforeply(ucharbuf &req, ucharbuf &p)
+ {
+ int extcmd = getint(req); // extended commands
+
+ //Build a new packet
+ putint(p, EXT_ACK); //send ack
+ putint(p, EXT_VERSION); //send version of extended info
+
+ switch(extcmd)
+ {
+ case EXT_UPTIME:
+ {
+ putint(p, totalsecs); //in seconds
+ break;
+ }
+
+ case EXT_PLAYERSTATS:
+ {
+ int cn = getint(req); //a special player, -1 for all
+
+ clientinfo *ci = NULL;
+ if(cn >= 0)
+ {
+ loopv(clients) if(clients[i]->clientnum == cn) { ci = clients[i]; break; }
+ if(!ci)
+ {
+ putint(p, EXT_ERROR); //client requested by id was not found
+ sendserverinforeply(p);
+ return;
+ }
+ }
+
+ putint(p, EXT_NO_ERROR); //so far no error can happen anymore
+
+ ucharbuf q = p; //remember buffer position
+ putint(q, EXT_PLAYERSTATS_RESP_IDS); //send player ids following
+ if(ci) putint(q, ci->clientnum);
+ else loopv(clients) putint(q, clients[i]->clientnum);
+ sendserverinforeply(q);
+
+ if(ci) extinfoplayer(p, ci);
+ else loopv(clients) extinfoplayer(p, clients[i]);
+ return;
+ }
+
+ case EXT_TEAMSCORE:
+ {
+ extinfoteams(p);
+ break;
+ }
+
+ default:
+ {
+ putint(p, EXT_ERROR);
+ break;
+ }
+ }
+ sendserverinforeply(p);
+ }
+