diff options
author | Matthijs Kuiper <info@matthijskuiper.nl> | 2018-01-08 23:47:23 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-08 23:47:23 +0100 |
commit | e861eafbeae0560add7956530d76de6cc285be20 (patch) | |
tree | c32e746977fde711cecd716570989014bf2d3592 /html/includes/renderer-ctf.php | |
parent | 66b162b5f01c996fd8a5cd4e570e31f8483cdffa (diff) | |
parent | 730c20dd04b5753cb372a289923e39516d1f8b87 (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.php | 264 |
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 |