=".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 = "
Cherrypick by ".renderPlayernameForTooltip($event[$capTeam]['flag_taken']['player']).""; // 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 = "
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 = "
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; } ?>