]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Network dom pps data in a more efficient way
authorterencehill <piuntn@gmail.com>
Thu, 4 Nov 2010 19:33:02 +0000 (20:33 +0100)
committerterencehill <piuntn@gmail.com>
Thu, 4 Nov 2010 19:33:02 +0000 (20:33 +0100)
qcsrc/client/Defs.qc
qcsrc/client/Main.qc
qcsrc/client/hud.qc
qcsrc/common/constants.qh
qcsrc/server/cl_client.qc
qcsrc/server/domination.qc

index e816fe221a13bc4994deb8aaf2f90318b1364e38..51e6d53deea83e8b9e5fe4503eb82f2052b899cf 100644 (file)
@@ -216,6 +216,13 @@ float race_status;
 string race_status_name;
 float race_myrank;
 
+// DOM
+float dom_total_pps;
+float dom_pps_red;
+float dom_pps_blue;
+float dom_pps_yellow;
+float dom_pps_pink;
+
 // Nexball
 float nb_pb_period;
 
index 9ed7d92e3630a5c6e115c3c044ba98390f7b8fd7..3615e8a5e1a77512a70a7b0b2ce157ed05c299e9 100644 (file)
@@ -1199,6 +1199,20 @@ void Net_ReadRace()
        }
 }
 
+void Net_ReadDom()
+{
+       if (dom_total_pps == 0)
+               dom_total_pps = ReadShort() / 100.0;
+       dom_pps_red = ReadShort() / 100.0;
+       dom_pps_blue = ReadShort() / 100.0;
+       //if dom_pps_yellow/dom_pps_pink was negative the first time we read it,
+       //it means the relative team doesn't exist and we don't have to read its value anymore
+       if (dom_pps_yellow >= 0)
+               dom_pps_yellow = ReadShort() / 100.0;
+       if (dom_pps_pink >= 0)
+               dom_pps_pink = ReadShort() / 100.0;
+}
+
 void Net_ReadSpawn()
 {
        zoomin_effect = 1;
@@ -1293,6 +1307,10 @@ float CSQC_Parse_TempEntity()
                        Net_ReadRace();
                        bHandled = true;
                        break;
+               case TE_CSQC_DOM:
+                       Net_ReadDom();
+                       bHandled = true;
+                       break;
                case TE_CSQC_SPAWN:
                        Net_ReadSpawn();
                        bHandled = true;
index a210070b701bcd1f55b8e7114ffafef05757007d..4b4408e7ef2163fa45f040a526e0b816d6036aa7 100644 (file)
@@ -4379,32 +4379,32 @@ void HUD_Mod_Race(vector pos, vector mySize)
 
 void DrawDomItem(vector myPos, vector mySize, float aspect_ratio, float layout, float i)
 {
-       float stat, pps_ratio;
+       float dom_pps, dom_pps_ratio;
        string pic;
        vector color;
        switch(i)
        {
                case 0:
-                       stat = getstatf(STAT_DOM_PPS_RED);
+                       dom_pps = dom_pps_red;
                        pic = "dom_icon_red";
                        color = '1 0 0';
                        break;
                case 1:
-                       stat = getstatf(STAT_DOM_PPS_BLUE);
+                       dom_pps = dom_pps_blue;
                        pic = "dom_icon_blue";
                        color = '0 0 1';
                        break;
                case 2:
-                       stat = getstatf(STAT_DOM_PPS_YELLOW);
+                       dom_pps = dom_pps_yellow;
                        pic = "dom_icon_yellow";
                        color = '1 1 0';
                        break;
                case 3:
-                       stat = getstatf(STAT_DOM_PPS_PINK);
+                       dom_pps = dom_pps_pink;
                        pic = "dom_icon_pink";
                        color = '1 0 1';
        }
-       pps_ratio = stat / getstatf(STAT_DOM_TOTAL_PPS);
+       dom_pps_ratio = dom_pps / dom_total_pps;
 
        if(mySize_x/mySize_y > aspect_ratio)
        {
@@ -4422,18 +4422,18 @@ void DrawDomItem(vector myPos, vector mySize, float aspect_ratio, float layout,
        if (layout) // show text too
        {
                //draw the text
-               color *= 0.5 + pps_ratio * (1 - 0.5); // half saturated color at min, full saturated at max
+               color *= 0.5 + dom_pps_ratio * (1 - 0.5); // half saturated color at min, full saturated at max
                if (layout == 2) // average pps
-                       drawstring_aspect(myPos + eX * mySize_y, ftos_decimals(stat, 2), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
+                       drawstring_aspect(myPos + eX * mySize_y, ftos_decimals(dom_pps, 2), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
                else // percentage of average pps
-                       drawstring_aspect(myPos + eX * mySize_y, strcat( ftos(floor(pps_ratio*100 + 0.5)), "%" ), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
+                       drawstring_aspect(myPos + eX * mySize_y, strcat( ftos(floor(dom_pps_ratio*100 + 0.5)), "%" ), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
        }
 
        //draw the icon
        drawpic_aspect_skin(myPos, pic, '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
-       if (stat > 0)
+       if (dom_pps > 0)
        {
-               drawsetcliparea(myPos_x, myPos_y + mySize_y * (1 - pps_ratio), mySize_y, mySize_y * pps_ratio);
+               drawsetcliparea(myPos_x, myPos_y + mySize_y * (1 - dom_pps_ratio), mySize_y, mySize_y * dom_pps_ratio);
                drawpic_aspect_skin(myPos, strcat(pic, "-highlighted"), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
                drawresetcliparea();
        }
index 8cda4b13ec41ed0e9664c5445bd81d79980bacb6..593dd8ce59a2ba468285de0e731224e2980857a5 100644 (file)
@@ -62,6 +62,7 @@ const float TE_CSQC_WEAPONCOMPLAIN = 113;
 const float TE_CSQC_CAMPINGRIFLE_SCOPE = 115;
 const float TE_CSQC_NEX_SCOPE = 116;
 const float TE_CSQC_CR_MAXBULLETS = 117;
+const float TE_CSQC_DOM = 119;
 
 const float RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder
 const float RACE_NET_CHECKPOINT_CLEAR = 1;
@@ -341,12 +342,6 @@ const float STAT_VEHICLESTAT_RELOAD2 = 66;
 const float STAT_REDALIVE = 100;
 const float STAT_BLUEALIVE = 101;
 
-const float STAT_DOM_TOTAL_PPS = 100;
-const float STAT_DOM_PPS_RED = 101;
-const float STAT_DOM_PPS_BLUE = 102;
-const float STAT_DOM_PPS_PINK = 103;
-const float STAT_DOM_PPS_YELLOW = 104;
-
 //const float STAT_SPIDERBOT_AIM     53 // compressShotOrigin
 //const float STAT_SPIDERBOT_TARGET  54 // compressShotOrigin
 
index fe5aa3ddc4b0a161ec9b75ad30addc34c807238e..2a72a1a46b9d2bbd1aa6d06c268b0bf7f0995a37 100644 (file)
@@ -1402,7 +1402,7 @@ Called when a client connects to the server
 string ColoredTeamName(float t);
 void DecodeLevelParms (void);
 //void dom_player_join_team(entity pl);
-void set_dom_state(void);
+void send_CSQC_dom_all();
 void ClientConnect (void)
 {
        float t;
@@ -1604,7 +1604,7 @@ void ClientConnect (void)
                send_CSQC_teamnagger();
 
        if (g_domination)
-               set_dom_state();
+               send_CSQC_dom_all();
        send_CSQC_cr_maxbullets(self);
 
        CheatInitClient();
index c163ab0feb9773e4b6034df97c15465a3d5d8811..bde905a07d8973d711f5237d949e334375a8ff0e 100644 (file)
@@ -25,30 +25,32 @@ float g_domination_point_rate;
 .float captime;
 
 // pps: points per second
-.float dom_total_pps;
-.float dom_pps_red;
-.float dom_pps_blue;
-.float dom_pps_yellow;
-.float dom_pps_pink;
-float total_pps;
-float pps_red;
-float pps_blue;
-float pps_yellow;
-float pps_pink;
-void set_dom_state(void)
+float dom_total_pps;
+float dom_pps_red;
+float dom_pps_blue;
+float dom_pps_yellow;
+float dom_pps_pink;
+void send_CSQC_dom_state()
 {
-       // BIG ugly hack to make stat sending work
-       self.dom_total_pps = total_pps;
-       self.dom_pps_red = pps_red;
-       self.dom_pps_blue = pps_blue;
-       if(c3 >= 0)
-       {
-               self.dom_pps_yellow = pps_yellow;
-       }
-       if(c4 >= 0)
-       {
-               self.dom_pps_pink = pps_pink;
-       }
+       WriteByte(MSG_ALL, SVC_TEMPENTITY);
+       WriteByte(MSG_ALL, TE_CSQC_DOM);
+       WriteShort(MSG_ALL, dom_pps_red * 100.0);
+       WriteShort(MSG_ALL, dom_pps_blue * 100.0);
+       if (c3 >= 0) WriteShort(MSG_ALL, dom_pps_yellow * 100.0);
+       if (c4 >= 0) WriteShort(MSG_ALL, dom_pps_pink * 100.0);
+}
+//Must be called ONLY when a client connects to send total pps and state
+//If yellow/pink team doesn't exist sends a negative dom_pps_yellow/dom_pps_pink
+//to let know the client to not read these values anymore
+void send_CSQC_dom_all()
+{
+       WriteByte(MSG_ALL, SVC_TEMPENTITY);
+       WriteByte(MSG_ALL, TE_CSQC_DOM);
+       WriteShort(MSG_ALL, dom_total_pps * 100.0);
+       WriteShort(MSG_ALL, dom_pps_red * 100.0);
+       WriteShort(MSG_ALL, dom_pps_blue * 100.0);
+       WriteShort(MSG_ALL, dom_pps_yellow * 100.0);
+       WriteShort(MSG_ALL, dom_pps_pink * 100.0);
 }
 
 void() dom_controlpoint_setup;
@@ -141,48 +143,47 @@ void dompoint_captured ()
        {
                // "fix" pps when slightly under 0 because of approximation errors
                case COLOR_TEAM1:
-                       pps_red -= (points/wait_time);
-                       if (pps_red < 0) pps_red = 0;
+                       dom_pps_red -= (points/wait_time);
+                       if (dom_pps_red < 0) dom_pps_red = 0;
                        break;
                case COLOR_TEAM2:
-                       pps_blue -= (points/wait_time);
-                       if (pps_blue < 0) pps_blue = 0;
+                       dom_pps_blue -= (points/wait_time);
+                       if (dom_pps_blue < 0) dom_pps_blue = 0;
                        break;
                case COLOR_TEAM3:
-                       pps_yellow -= (points/wait_time);
-                       if (pps_yellow < 0) pps_yellow = 0;
+                       dom_pps_yellow -= (points/wait_time);
+                       if (dom_pps_yellow < 0) dom_pps_yellow = 0;
                        break;
                case COLOR_TEAM4:
-                       pps_pink -= (points/wait_time);
-                       if (pps_pink < 0) pps_pink = 0;
+                       dom_pps_pink -= (points/wait_time);
+                       if (dom_pps_pink < 0) dom_pps_pink = 0;
        }
 
        switch(self.goalentity.team)
        {
-               // "fix" pps when slightly over total_pps because of approximation errors
+               // "fix" pps when slightly over dom_total_pps because of approximation errors
                case COLOR_TEAM1:
-                       pps_red += (points/wait_time);
-                       if (pps_red > total_pps) pps_red = total_pps;
+                       dom_pps_red += (points/wait_time);
+                       if (dom_pps_red > dom_total_pps) dom_pps_red = dom_total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-red", "", "");
                        break;
                case COLOR_TEAM2:
-                       pps_blue += (points/wait_time);
-                       if (pps_blue > total_pps) pps_blue = total_pps;
+                       dom_pps_blue += (points/wait_time);
+                       if (dom_pps_blue > dom_total_pps) dom_pps_blue = dom_total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-blue", "", "");
                        break;
                case COLOR_TEAM3:
-                       pps_yellow += (points/wait_time);
-                       if (pps_yellow > total_pps) pps_yellow = total_pps;
+                       dom_pps_yellow += (points/wait_time);
+                       if (dom_pps_yellow > dom_total_pps) dom_pps_yellow = dom_total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-yellow", "", "");
                        break;
                case COLOR_TEAM4:
-                       pps_pink += (points/wait_time);
-                       if (pps_pink > total_pps) pps_pink = total_pps;
+                       dom_pps_pink += (points/wait_time);
+                       if (dom_pps_pink > dom_total_pps) dom_pps_pink = dom_total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-pink", "", "");
        }
 
-       FOR_EACH_PLAYER(self)
-               set_dom_state();
+       send_CSQC_dom_state();
 
        WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, colormapPaletteColor(self.goalentity.team - 1, 0));
        WaypointSprite_Ping(self.sprite);
@@ -382,7 +383,7 @@ void dom_controlpoint_setup()
        else
                waittime = self.wait;
 
-       total_pps += points/waittime;
+       dom_total_pps += points/waittime;
 
        if(!self.t_width)
                self.t_width = 0.02; // frame animation rate
@@ -706,6 +707,8 @@ void dom_delayedinit()
                        }
                }
        }
+       if (c3 == -1) dom_pps_yellow = -1;
+       if (c4 == -1) dom_pps_pink = -1;
 
        ScoreRules_dom();
 };
@@ -723,12 +726,6 @@ void dom_init()
        precache_sound("domination/claim.wav");
        InitializeEntity(world, dom_delayedinit, INITPRIO_GAMETYPE);
 
-       addstat(STAT_DOM_TOTAL_PPS, AS_FLOAT, dom_total_pps);
-       addstat(STAT_DOM_PPS_RED, AS_FLOAT, dom_pps_red);
-       addstat(STAT_DOM_PPS_BLUE, AS_FLOAT, dom_pps_blue);
-       if(c3 >= 0) addstat(STAT_DOM_PPS_YELLOW, AS_FLOAT, dom_pps_yellow);
-       if(c4 >= 0) addstat(STAT_DOM_PPS_PINK, AS_FLOAT, dom_pps_pink);
-
        g_domination_point_rate = cvar("g_domination_point_rate");
        g_domination_point_amt = cvar("g_domination_point_amt");