summaryrefslogtreecommitdiff
path: root/html/includes/renderer-ctf.php
diff options
context:
space:
mode:
authorMatthijs Kuiper <info@matthijskuiper.nl>2018-01-08 23:47:23 +0100
committerGitHub <noreply@github.com>2018-01-08 23:47:23 +0100
commite861eafbeae0560add7956530d76de6cc285be20 (patch)
treec32e746977fde711cecd716570989014bf2d3592 /html/includes/renderer-ctf.php
parent66b162b5f01c996fd8a5cd4e570e31f8483cdffa (diff)
parent730c20dd04b5753cb372a289923e39516d1f8b87 (diff)
Merge pull request #5 from randommonk/develop4.3.0
Bumped version to 4.3. Added jpgraph stats developed by killerEye
Diffstat (limited to 'html/includes/renderer-ctf.php')
-rw-r--r--html/includes/renderer-ctf.php264
1 files changed, 264 insertions, 0 deletions
diff --git a/html/includes/renderer-ctf.php b/html/includes/renderer-ctf.php
new file mode 100644
index 0000000..9e0cef3
--- /dev/null
+++ b/html/includes/renderer-ctf.php
@@ -0,0 +1,264 @@
+<?php
+
+require_once 'renderer-general-import.php';
+
+/**
+Render graph with scores & grabs
+*/
+function renderScoreGraph($uid) {
+ global $matchid;
+ global $time_gamestart;
+ global $time_gameend;
+ global $time_ratio_correction;
+ global $playernumberofteams;
+ global $playerteams;
+
+ $uid = mysql_real_escape_string($uid);
+
+ // Get all frags related events + start & end
+ $q_frags = mysql_query("SELECT * FROM `uts_temp_$uid` WHERE col0>=".mysql_real_escape_string($time_gamestart)." ORDER BY id ASC") or die(mysql_error());
+
+ // init caps/grabs array
+ $caps = array();
+ $grabs = array();
+ $lastCapTeam = array();
+ $overTimeCap = false;
+
+ $teamLabels = generateTeamLabels();
+ $realTimeEnd = ($time_gameend-$time_gamestart)/$time_ratio_correction/60;
+
+ // init vars & ensure datapoint at origin
+ for($i=0;$i<$playernumberofteams;$i++) {
+ $caps[$i][0] = array(0,0);
+ $prevcaps[$i] = 0;
+ $prevgrabs[$i] = 0;
+
+ $flagmid[$i] = 0;
+ $flagbase[$i] = 0;
+ $flagclose[$i] = 0;
+ $flagnmybase[$i] = 0;
+ $flagcap[$i] = 0;
+ }
+
+ $counter = 1;
+ while($data = mysql_fetch_array($q_frags)) {
+
+ // Collect data from utstats own table
+ $r_id = $data[0];
+ $r_time = round(($data[1]-$time_gamestart)/$time_ratio_correction/60,2); // Transform UT time to real time
+ $r_type = $data[2];
+ $r_capper = $data[3];
+ $r_team = $playerteams[$r_capper];
+
+ // Try to get team directly from data if possible, in case not found in playerteam db
+ if(!($r_team >=0 && strlen($r_team)>0)) {
+ if($data[4] == 0 || $data[4] == 20)
+ $r_team = 1;
+ if($data[4] == 1 || $data[4] == 14)
+ $r_team = 0;
+ }
+
+ // Only collect team stats if team was found - sometimes this is bugged
+ if($r_team >=0 && strlen($r_team)>0) {
+
+ // If flag is captured, save this datapoint
+ if($r_type == "flag_captured") {
+ $prevcaps[$r_team]++;
+ $flagcap[$r_team]++;
+ $flagnmybase[$r_team]--;
+
+ // Analyse cap for tooltip data
+ $capdata = analyseCap($uid,$data[1],$r_capper,$r_team,$r_id);
+
+ $caps[$r_team][] = array("x" => $r_time,"y" => $prevcaps[$r_team], "tooltipdata" => $capdata);
+ $lastCapTeam = array($r_time,$r_team);
+
+ // If grab is done, simply save this event
+ } else if($r_type == "flag_taken") {
+ $prevgrabs[$r_team]++;
+ $flagnmybase[$r_team]++;
+ } else if($r_type == "flag_return_mid") {
+ $flagmid[$r_team]++;
+ $flagnmybase[$r_team]--;
+ } else if($r_type == "flag_return_enemybase") {
+ $flagbase[$r_team]++;
+ $flagnmybase[$r_team]--;
+ } else if($r_type == "flag_return_closesave") {
+ $flagclose[$r_team]++;
+ $flagnmybase[$r_team]--;
+
+ }
+
+ // If game_end event & game ended cause timelimit reached, round the time down to prevent UT gay timing to screw the graph
+ } if($r_type == "game_end") {
+
+ // If it's a regular timelimit, floor the time to get it nicely rounded (ref gay UT timing)\
+ $overTimeCap = (($r_time-$lastCapTeam[0])<=0.01);
+
+ if($r_capper == "timelimit" && !$overTimeCap)
+ $r_time = round($r_time);
+
+ // Repeat final CTF score at the end
+ for($i=0;$i<$playernumberofteams;$i++) {
+ if(!$overTimeCap || $i != $lastCapTeam[1])
+ $caps[$i][] = array($r_time,$prevcaps[$i]);
+ }
+ }
+
+ // Each minute, save amount of grabs. Don't do it for last minute if this one was less than half a minute
+ if(($r_time>=$counter && ($realTimeEnd-$r_time)>0.49) || $r_type == "game_end") {
+
+ // Save grabs last min and reset
+ for($i=0;$i<$playernumberofteams;$i++) {
+ $grabs[$i][] = $prevgrabs[$i];
+ $prevgrabs[$i] = 0;
+ }
+
+ $counter++;
+ }
+ }
+
+ // Ensure flagNmyBase is at least 0
+ for($i=0;$i<$playernumberofteams;$i++) {
+ if($flagnmybase[$i]<0)
+ $flagnmybase[$i] = 0;
+ }
+
+ // Save team score over team for teams
+ mysql_query("INSERT INTO uts_chartdata (mid,chartid,data,labels) VALUES (".$matchid.", ".RENDERER_CHART_CTF_TEAMSCORE.",
+ '".mysql_real_escape_string(gzencode(serialize(array($grabs,$caps))))."',
+ '".mysql_real_escape_string(gzencode(serialize($teamLabels)))."')") or die(mysql_error());
+
+ $labelsBreakdown = array('caps','close','base','mid','enemy base');
+
+ // Save team score over team for teams
+ mysql_query("INSERT INTO uts_chartdata (mid,chartid,data,labels) VALUES (".$matchid.", ".RENDERER_CHART_CTF_GRABBREAKDOWN.",
+ '".mysql_real_escape_string(gzencode(serialize(array($flagcap,$flagclose,$flagbase,$flagmid,$flagnmybase))))."',
+ '".mysql_real_escape_string(gzencode(serialize($labelsBreakdown)))."')") or die(mysql_error());
+
+}
+
+/**
+Analyse cap to show in tooltip
+*/
+function analyseCap($uid, $capTime, $capPlayer,$capTeam, $capId) {
+ global $playernames;
+ global $playerteams;
+ global $time_ratio_correction;
+
+ // Initialise variables
+ $tooltip = '';
+ $cherrypick = '';
+ $solocap = '';
+ $standoff = '';
+ $hero = '';
+ $event = array();
+ $cherrypickDone = false;
+
+ $event[0]['flag_taken'] = array('id' => 0, 'time' => 0, 'player' => '');
+ $event[0]['flag_returned'] = array('id' => 0, 'time' => 0, 'player' => '');
+ $event[0]['flag_captured'] = array('id' => 0, 'time' => 0, 'player' => '');
+ $event[1]['flag_taken'] = array('id' => 0, 'time' => 0, 'player' => '');
+ $event[1]['flag_returned'] = array('id' => 0, 'time' => 0, 'player' => '');
+ $event[1]['flag_captured'] = array('id' => 0, 'time' => 0, 'player' => '');
+
+ // Get grab time for both teams related to this cap. Query of the month award.
+ $q_grabs = mysql_query("SELECT f.id AS id, f.col0 AS gtime, f.col1 AS event, f.col2 AS player, f.col3 AS team
+ FROM (
+ SELECT col3, col1, MAX( col0 ) AS xgtime FROM `uts_temp_$uid` WHERE (col1 = 'flag_taken' OR col1 = 'flag_returned' OR col1 = 'flag_captured') AND id<".mysql_real_escape_string($capId)." GROUP BY col3,col1 ORDER BY col3 DESC
+ ) AS x INNER JOIN `uts_temp_$uid` AS f
+ on f.col3 = x.col3 AND f.col1 = x.col1 AND f.col0 = x.xgtime") or die(mysql_error());
+
+ // Only continue if you have at least one event (should be at least flag_taken for this cap)
+ if(mysql_num_rows($q_grabs) >0) {
+
+ while($r_grabs = mysql_fetch_array($q_grabs)) {
+ // Ugly code to fix bug where sometimes 20 or 14 is imported instead of 0 and 1 respectively
+ $fixedteam = ($r_grabs['team']==20)?0:$r_grabs['team'];
+ $fixedteam = ($fixedteam==14)?1:$fixedteam;
+
+ // Swap team around since ut logs which flag has been taken, thus opposite team actually took it
+ $event[1-$fixedteam][$r_grabs['event']] = array('id' => $r_grabs['id'],'time' => $r_grabs['gtime'],'player' => $r_grabs['player']);
+ }
+
+ // Determine how long flags were holded
+ $flagHolded[$capTeam] = $capTime - $event[$capTeam]['flag_taken']['time'];
+ $flagHolded[1-$capTeam] = $event[1-$capTeam]['flag_returned']['time'] - $event[1-$capTeam]['flag_taken']['time'];
+
+ // Determine if this cap resulted from a cherrypick
+ // For this the flag shoudl be taken within 4 seconds after return
+ // Only register as cherry pick if previous run was at least 10 sec, otherwise it's not really a hcerry pick but just a subsequent grab
+ if($event[$capTeam]['flag_returned']['time']>0 && ($event[$capTeam]['flag_taken']['time']-$event[$capTeam]['flag_returned']['time'])<4) {
+
+ $prevRunTime = small_query("SELECT MAX( col0 ) as gtime FROM `uts_temp_$uid` WHERE id<".mysql_real_escape_string($event[$capTeam]['flag_returned']['id'])." AND col1='flag_taken' AND col3='".(1-$capTeam)."'") or die(mysql_error());
+
+ if(($event[$capTeam]['flag_returned']['time'] - $prevRunTime[0]) > 10)
+ $cherrypickDone = true;
+ }
+
+ if($event[$capTeam]['flag_captured']['time']>0 && ($event[$capTeam]['flag_taken']['time']-$event[$capTeam]['flag_captured']['time'])<4)
+ $cherrypickDone = true;
+
+ if($cherrypickDone)
+ $cherrypick = "<br><span style=\"fontSize: '7px'; font-style: italic;\">Cherrypick by ".renderPlayernameForTooltip($event[$capTeam]['flag_taken']['player'])."</span>";
+
+ // Determine if solo cap
+ // First check if person who grabbed is same person as capper
+ if($event[$capTeam]['flag_taken']['player'] == $capPlayer) {
+
+ // Second check is to see no pickups were done during this run
+ if(small_count("SELECT * FROM `uts_temp_$uid` WHERE col1 = 'flag_pickedup' AND col3 = '".(1-$capTeam)."' AND id<".mysql_real_escape_string($capId)." AND id>".mysql_real_escape_string($event[$capTeam]['flag_taken']['id'])) == 0) {
+
+ $solocap = "<br>Solo cap";
+
+ }
+
+ }
+
+ // If taken for more than 30 seconds for both teams, this is a long standoff
+ // Add who did the return
+ if($flagHolded[$capTeam] > 30 && $flagHolded[1-$capTeam] > 30 && $event[1-$capTeam]['flag_returned']['player'] >= 0)
+ $standoff = "<br>Standoff return by ".renderPlayernameForTooltip($event[1-$capTeam]['flag_returned']['player']);
+
+ $tooltip = "Capped by : ".renderPlayernameForTooltip($capPlayer)." (".renderTimeForTooltip($flagHolded[$capTeam]/$time_ratio_correction).")";
+ $tooltip .= $cherrypick;
+ $tooltip .= $solocap;
+ $tooltip .= $standoff;
+
+ }
+
+ return $tooltip;
+}
+
+/**
+Prep temporary database for CTF parsing
+*/
+function prepCTFdata($safe_uid) {
+
+ // Replace time-out return by normal return
+ mysql_query("UPDATE `uts_temp_$safe_uid` SET col1='flag_returned', col2=(@temp:=col2),col2='-1',col3=@temp WHERE col1='flag_returned_timeout'") or die(mysql_error());
+
+}
+
+function renderPlayernameForTooltip($pid) {
+ global $playernames;
+
+ return substr($playernames[$pid],0,25);
+}
+
+function renderTimeForTooltip($time) {
+
+ $minutes = floor($time/60);
+ if($minutes > 0) {
+ $strtime = $minutes."min ";
+ $time = $time - $minutes*60;
+ }
+
+ $seconds = round($time,0);
+ if($seconds >= 1)
+ $strtime .= $seconds."sec";
+
+ return $strtime;
+}
+
+?> \ No newline at end of file