]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/domination.qc
Some quick better defaults for centerprints -- leave the fontscale for now, as that...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / domination.qc
index 2b6650b3d310ee3e8f514c30b58c8c37936a28ef..a6cc9a88de0ac6d9f90f0775f3673d01d94c753f 100644 (file)
@@ -22,32 +22,26 @@ Note: The only teams who can use dom control points are identified by spawnfunc_
 .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;
-void send_CSQC_dom_state()
+.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(entity e)
 {
-       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);
+       // BIG ugly hack to make stat sending work
+       e.dom_total_pps = total_pps;
+       e.dom_pps_red = pps_red;
+       e.dom_pps_blue = pps_blue;
+       if(c3 >= 0)
+               e.dom_pps_yellow = pps_yellow;
+       if(c4 >= 0)
+               e.dom_pps_pink = pps_pink;
 }
 
 void() dom_controlpoint_setup;
@@ -115,9 +109,9 @@ void dompoint_captured ()
 
        if (head.noise != "")
                if(self.enemy)
-                       sound(self.enemy, CHAN_AUTO, head.noise, VOL_BASE, ATTN_NORM);
+                       sound(self.enemy, CH_TRIGGER, head.noise, VOL_BASE, ATTN_NORM);
                else
-                       sound(self, CHAN_TRIGGER, head.noise, VOL_BASE, ATTN_NORM);
+                       sound(self, CH_TRIGGER_SINGLE, head.noise, VOL_BASE, ATTN_NORM);
        if (head.noise1 != "")
                play2all(head.noise1);
 
@@ -140,52 +134,53 @@ void dompoint_captured ()
        {
                // "fix" pps when slightly under 0 because of approximation errors
                case COLOR_TEAM1:
-                       dom_pps_red -= (points/wait_time);
-                       if (dom_pps_red < 0) dom_pps_red = 0;
+                       pps_red -= (points/wait_time);
+                       if (pps_red < 0) pps_red = 0;
                        break;
                case COLOR_TEAM2:
-                       dom_pps_blue -= (points/wait_time);
-                       if (dom_pps_blue < 0) dom_pps_blue = 0;
+                       pps_blue -= (points/wait_time);
+                       if (pps_blue < 0) pps_blue = 0;
                        break;
                case COLOR_TEAM3:
-                       dom_pps_yellow -= (points/wait_time);
-                       if (dom_pps_yellow < 0) dom_pps_yellow = 0;
+                       pps_yellow -= (points/wait_time);
+                       if (pps_yellow < 0) pps_yellow = 0;
                        break;
                case COLOR_TEAM4:
-                       dom_pps_pink -= (points/wait_time);
-                       if (dom_pps_pink < 0) dom_pps_pink = 0;
+                       pps_pink -= (points/wait_time);
+                       if (pps_pink < 0) pps_pink = 0;
        }
 
        switch(self.goalentity.team)
        {
-               // "fix" pps when slightly over dom_total_pps because of approximation errors
+               // "fix" pps when slightly over total_pps because of approximation errors
                case COLOR_TEAM1:
-                       dom_pps_red += (points/wait_time);
-                       if (dom_pps_red > dom_total_pps) dom_pps_red = dom_total_pps;
+                       pps_red += (points/wait_time);
+                       if (pps_red > total_pps) pps_red = total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-red", "", "");
                        break;
                case COLOR_TEAM2:
-                       dom_pps_blue += (points/wait_time);
-                       if (dom_pps_blue > dom_total_pps) dom_pps_blue = dom_total_pps;
+                       pps_blue += (points/wait_time);
+                       if (pps_blue > total_pps) pps_blue = total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-blue", "", "");
                        break;
                case COLOR_TEAM3:
-                       dom_pps_yellow += (points/wait_time);
-                       if (dom_pps_yellow > dom_total_pps) dom_pps_yellow = dom_total_pps;
+                       pps_yellow += (points/wait_time);
+                       if (pps_yellow > total_pps) pps_yellow = total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-yellow", "", "");
                        break;
                case COLOR_TEAM4:
-                       dom_pps_pink += (points/wait_time);
-                       if (dom_pps_pink > dom_total_pps) dom_pps_pink = dom_total_pps;
+                       pps_pink += (points/wait_time);
+                       if (pps_pink > total_pps) pps_pink = total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-pink", "", "");
        }
 
-       send_CSQC_dom_state();
-
        WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, colormapPaletteColor(self.goalentity.team - 1, 0));
        WaypointSprite_Ping(self.sprite);
 
        self.captime = time;
+
+       FOR_EACH_REALCLIENT(head)
+               set_dom_state(head);
 };
 
 void AnimateDomPoint()
@@ -371,16 +366,16 @@ void dom_controlpoint_setup()
                self.wait = 5;
 
        float points, waittime;
-       if (g_domination_point_rate)
-               points = g_domination_point_rate;
+       if (autocvar_g_domination_point_rate)
+               points = autocvar_g_domination_point_rate;
        else
                points = self.frags;
-       if (g_domination_point_amt)
-               waittime = g_domination_point_amt;
+       if (autocvar_g_domination_point_amt)
+               waittime = autocvar_g_domination_point_amt;
        else
                waittime = self.wait;
 
-       dom_total_pps += points/waittime;
+       total_pps += points/waittime;
 
        if(!self.t_width)
                self.t_width = 0.02; // frame animation rate
@@ -397,8 +392,7 @@ void dom_controlpoint_setup()
        droptofloor();
 
        waypoint_spawnforitem(self);
-       WaypointSprite_SpawnFixed("dom-neut", self.origin + '0 0 32', self, sprite);
-       WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, '0 1 1');
+       WaypointSprite_SpawnFixed("dom-neut", self.origin + '0 0 32', self, sprite, RADARICON_DOMPOINT, '0 1 1');
 };
 
 
@@ -686,26 +680,17 @@ void dom_delayedinit()
        // if no control points are found, spawn defaults
        if (find(world, classname, "dom_controlpoint") == world)
        {
-               // here follow default domination points for each map
-               /*
-               if (world.model == "maps/e1m1.bsp")
-               {
-                       dom_spawnpoint('0 0 0');
-               }
-               else
-               */
+               // TODO in a few months (maybe 2011/08): change this into error() and remove this very poor dom point selection
+               backtrace("This map contains no dom_controlpoint entities. A very poor dom point placement will be chosen. Please fix the map.");
+
+               // if no supported map was found, make every deathmatch spawn a point
+               head = find(world, classname, "info_player_deathmatch");
+               while (head)
                {
-                       // if no supported map was found, make every deathmatch spawn a point
-                       head = find(world, classname, "info_player_deathmatch");
-                       while (head)
-                       {
-                               dom_spawnpoint(head.origin);
-                               head = find(head, classname, "info_player_deathmatch");
-                       }
+                       dom_spawnpoint(head.origin);
+                       head = find(head, classname, "info_player_deathmatch");
                }
        }
-       if (c3 == -1) dom_pps_yellow = -1;
-       if (c4 == -1) dom_pps_pink = -1;
 
        ScoreRules_dom();
 };
@@ -723,7 +708,10 @@ void dom_init()
        precache_sound("domination/claim.wav");
        InitializeEntity(world, dom_delayedinit, INITPRIO_GAMETYPE);
 
-       g_domination_point_rate = cvar("g_domination_point_rate");
-       g_domination_point_amt = cvar("g_domination_point_amt");
+       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);
 };