drawfont = hud_font;
}
+void DrawDomCP(vector myPos, vector mySize, float i)
+{
+ float stat;
+ vector color;
+ switch(i)
+ {
+ case 0:
+ stat = getstatf(STAT_DOM_PPS_RED);
+ color = '1 0 0';
+ break;
+ case 1:
+ stat = getstatf(STAT_DOM_PPS_BLUE);
+ color = '0 0 1';
+ break;
+ case 2:
+ stat = getstatf(STAT_DOM_PPS_YELLOW);
+ color = '1 1 0';
+ break;
+ case 3:
+ stat = getstatf(STAT_DOM_PPS_PINK);
+ color = '1 0 1';
+ }
+
+ vector newSize, newPos;
+ if(mySize_x/mySize_y > 3)
+ {
+ newSize_x = 3 * mySize_y;
+ newSize_y = mySize_y;
+
+ newPos_x = myPos_x + (mySize_x - newSize_x) / 2;
+ newPos_y = myPos_y;
+ }
+ else
+ {
+ newSize_y = 1/3 * mySize_x;
+ newSize_x = mySize_x;
+
+ newPos_y = myPos_y + (mySize_y - newSize_y) / 2;
+ newPos_x = myPos_x;
+ }
+
+ vector picpos, numpos;
+ numpos = newPos + eX * newSize_y;
+ /*
+ if(autocvar_hud_panel_modicons_iconalign)
+ {
+ numpos = newPos;
+ picpos = newPos + eX * 2 * newSize_y;
+ }
+ else
+ {
+ numpos = newPos + eX * newSize_y;
+ picpos = newPos;
+ }
+ */
+
+ drawfont = hud_bigfont;
+ if (cvar("hud_panel_modicons_dom_pps")) // average pps
+ drawstring_aspect(numpos, ftos_decimals(stat, 2), eX * (2/3) * newSize_x + eY * newSize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
+ else // percentage of average pps
+ drawstring_aspect(numpos, strcat(ftos_decimals(stat*100 / getstatf(STAT_DOM_TOTAL_PPS), 0), "%"), eX * (2/3) * newSize_x + eY * newSize_y, color, panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawfont = hud_font;
+
+ // TODO draw controlpoints icons with a bar
+ // representing the percentage of average pps
+ // and maybe show smaller strings
+}
+
+void HUD_Mod_Dom(vector myPos, vector mySize)
+{
+ print("test ", ftos(cvar("aaa")), "\n");
+ entity tm;
+ float teams_count;
+ for(tm = teams.sort_next; tm; tm = tm.sort_next)
+ if(tm.team != COLOR_SPECTATOR)
+ ++teams_count;
+
+ float rows, columns;
+ rows = mySize_y/mySize_x;
+ rows = bound(1, floor((sqrt((4 * 1 * teams_count + rows) * rows) + rows + 0.5) / 2), teams_count);
+ columns = ceil(teams_count/rows);
+
+ drawfont = hud_bigfont;
+ int i;
+ float row, column;
+ for(i=0; i<teams_count; ++i)
+ {
+ vector pos, size;
+ pos = myPos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows);
+ size = eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows);
+
+ DrawDomCP(pos, size, i);
+
+ ++row;
+ if(row >= rows)
+ {
+ row = 0;
+ ++column;
+ }
+ }
+ drawfont = hud_font;
+}
+
float mod_prev; // previous state of mod_active to check for a change
float mod_alpha;
float mod_change; // "time" when mod_active changed
if(!autocvar_hud_panel_modicons && !autocvar__hud_configure)
return;
- if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && !autocvar__hud_configure)
+ if (gametype != GAME_KEYHUNT && gametype != GAME_CTF && gametype != GAME_NEXBALL && gametype != GAME_CTS && gametype != GAME_RACE && gametype != GAME_DOMINATION && !autocvar__hud_configure)
return;
active_panel = HUD_PANEL_MODICONS;
HUD_Mod_NexBall(pos, mySize);
else if(gametype == GAME_CTS || gametype == GAME_RACE)
HUD_Mod_Race(pos, mySize);
+ else if(gametype == GAME_DOMINATION)
+ HUD_Mod_Dom(pos, mySize);
}
// Draw pressed keys (#11)
const float STAT_LEADLIMIT = 47;
const float STAT_BULLETS_LOADED = 48;
+const float STAT_DOM_TOTAL_PPS = 70;
+const float STAT_DOM_PPS_RED = 71;
+const float STAT_DOM_PPS_BLUE = 72;
+const float STAT_DOM_PPS_PINK = 73;
+const float STAT_DOM_PPS_YELLOW = 74;
+
// see DP source, quakedef.h
const float STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW = 222;
const float STAT_MOVEVARS_AIRSTRAFEACCEL_QW = 223;
.float uid_kicktime;
.string uid;
#endif
+float total_pps;
+.float dom_total_pps;
void ClientConnect (void)
{
float t;
else if(cvar("sv_teamnagger") && !g_ca) // teamnagger is currently bad for ca
send_CSQC_teamnagger();
+ if (g_domination)
+ self.dom_total_pps = total_pps;
+
CheatInitClient();
}
.entity sprite;
.float captime;
+// pps (points per second)
+.float dom_pps_red;
+.float dom_pps_blue;
+.float dom_pps_pink;
+.float dom_pps_yellow;
+float pps_red;
+float pps_blue;
+float pps_pink;
+float pps_yellow;
+
void() dom_controlpoint_setup;
void LogDom(string mode, float team_before, entity actor)
self.delay = old_delay;
self.team = old_team;
+ switch(self.team)
+ {
+ case COLOR_TEAM1:
+ pps_red -= (points/wait_time);
+ break;
+ case COLOR_TEAM2:
+ pps_blue -= (points/wait_time);
+ break;
+ case COLOR_TEAM3:
+ pps_yellow -= (points/wait_time);
+ break;
+ case COLOR_TEAM4:
+ pps_pink -= (points/wait_time);
+ }
+
switch(self.goalentity.team)
{
case COLOR_TEAM1:
+ pps_red += (points/wait_time);
WaypointSprite_UpdateSprites(self.sprite, "dom-red", "", "");
break;
case COLOR_TEAM2:
+ pps_blue += (points/wait_time);
WaypointSprite_UpdateSprites(self.sprite, "dom-blue", "", "");
break;
case COLOR_TEAM3:
+ pps_yellow += (points/wait_time);
WaypointSprite_UpdateSprites(self.sprite, "dom-yellow", "", "");
break;
case COLOR_TEAM4:
+ pps_pink += (points/wait_time);
WaypointSprite_UpdateSprites(self.sprite, "dom-pink", "", "");
- break;
}
+
+ entity player;
+ FOR_EACH_CLIENT(player)
+ {
+ player.dom_pps_red = pps_red;
+ player.dom_pps_blue = pps_blue;
+ player.dom_pps_yellow = pps_yellow;
+ player.dom_pps_pink = pps_pink;
+ }
+
WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, colormapPaletteColor(self.goalentity.team - 1, 0));
WaypointSprite_Ping(self.sprite);
if (gameover || self.delay > time || time < game_starttime) // game has ended, don't keep giving points
return;
- g_domination_point_rate = cvar("g_domination_point_rate");
- g_domination_point_amt = cvar("g_domination_point_amt");
-
if(g_domination_point_rate)
self.delay = time + g_domination_point_rate;
else
self.effects = self.effects | EF_LOWPRECISION;
if (cvar("g_domination_point_fullbright"))
self.effects |= EF_FULLBRIGHT;
+
+ float points, waittime;
+ if (g_domination_point_rate)
+ points += g_domination_point_rate;
+ else
+ points += self.frags;
+ if (g_domination_point_amt)
+ waittime += g_domination_point_amt;
+ else
+ waittime += self.wait;
+ total_pps += points/waittime;
};
// code from here on is just to support maps that don't have control point and team entities
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);
+ addstat(STAT_DOM_PPS_PINK , AS_FLOAT, dom_pps_pink);
+ addstat(STAT_DOM_PPS_YELLOW, AS_FLOAT, dom_pps_yellow);
+
+ g_domination_point_rate = cvar("g_domination_point_rate");
+ g_domination_point_amt = cvar("g_domination_point_amt");
+
// teamplay is always on in domination, defaults to hurt self but not teammates
//if(!teams_matter)
// cvar_set("teamplay", "3");