hlstatsx/web/includes/functions_graph.php

443 lines
16 KiB
PHP

<?php
/*
HLstatsX Community Edition - Real-time player and clan rankings and statistics
Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
http://www.hlxcommunity.com
HLstatsX Community Edition is a continuation of
ELstatsNEO - Real-time player and clan rankings and statistics
Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
http://ovrsized.neo-soft.org/
ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
http://www.hlstatsx.com/
Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
HLstatsX is an enhanced version of HLstats made by Simon Garner
HLstats - Real-time player and clan rankings and statistics for Half-Life
http://sourceforge.net/projects/hlstats/
Copyright (C) 2001 Simon Garner
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
For support and installation notes visit http://www.hlxcommunity.com
*/
function image_dashed_line($image, $x1, $y1, $x2, $y2, $style)
{
if (count($style)>0) {
$temp_x1 = $x1;
$temp_y1 = $y1;
$count = 0;
while (($temp_x1<$x2) || ($temp_y1<$y2)) {
$my_style = $style[$count % count($style)];
$step = 0;
while ($my_style != $style[(($count+$step) % count($style))]) {
$step++;
}
if ($step==0)
$step++;
if ($x1 != $x2) {
if ($my_style != -1)
imageline($image, $temp_x1, $y1, $temp_x1+$step, $y2, $my_style);
$temp_x1 = $temp_x1 + $step;
}
if ($y1!=$y2) {
if ($my_style != -1)
imageline($image, $x1, $temp_y1, $x2, $temp_y1+$step, $my_style);
$temp_y1 = $temp_y1 + $step;
}
$count = $count + $step;
}
} else {
imageline($image, $x1, $y1, $x2, $y2, $style[0]);
}
}
//TSGK
$first_entry = 0;
//TSGK
function drawItems($image, $bounds, $data_array, $max_index, $name, $dot, $make_grid, $write_timestamp, $write_legend, $color)
{
global $max_pos_y;
global $legend_x;
global $bar_type;
global $deletedays;
global $server_load_type;
//TSGK
global $first_entry;
$first_entry++;
//TSGK
if (!isset($max_pos_y[$max_index])) {
$max_pos_y[$max_index] = 0;
}
foreach ($data_array as $entry) {
if ($entry[$name] >= $max_pos_y[$max_index]) {
if ($entry[$name] < 100)
$max_pos_y[$max_index] = $entry[$name] + 2;
else if ($entry[$name] < 200)
$max_pos_y[$max_index] = $entry[$name] + 10;
else if ($entry[$name] < 10000)
$max_pos_y[$max_index] = $entry[$name] + ($entry[$name] * 0.3);
else
$max_pos_y[$max_index] = $entry[$name] - ($entry[$name] % 50000) + 100000;
if ($make_grid > 0) {
if ($max_pos_y[$max_index] % 2 != 0)
$max_pos_y[$max_index]++;
$i = 0;
while (($i < 10) && ($max_pos_y[$max_index] % 4 != 0)) {
$max_pos_y[$max_index]++;
$i++;
}
}
if ($max_pos_y[$max_index] == 0)
$max_pos_y[$max_index] = 1;
}
}
if ($write_legend > 0) {
if ($legend_x == 0)
$legend_x += $bounds['indent_x'][0] + 10;
imagesetpixel($image, $legend_x, $bounds['indent_y'][0]-7, $color[0]);
imagesetpixel($image, $legend_x+1, $bounds['indent_y'][0]-7, $color[0]);
imagesetpixel($image, $legend_x+2, $bounds['indent_y'][0]-7, $color[0]);
imagesetpixel($image, $legend_x, $bounds['indent_y'][0]-8, $color[0]);
imagesetpixel($image, $legend_x+1, $bounds['indent_y'][0]-8, $color[0]);
imagesetpixel($image, $legend_x+2, $bounds['indent_y'][0]-8, $color[0]);
imagesetpixel($image, $legend_x, $bounds['indent_y'][0]-9, $color[0]);
imagesetpixel($image, $legend_x+1, $bounds['indent_y'][0]-9, $color[0]);
imagesetpixel($image, $legend_x+2, $bounds['indent_y'][0]-9, $color[0]);
$legend_x += 7;
imagestring($image, 1, $legend_x, $bounds['indent_y'][0]-11, $name , $color[2]);
$legend_x += (imagefontwidth(1) * strlen($name)) + 7;
}
$start_pos = array("x" => $bounds['width']-$bounds['indent_x'][1], "y" => $bounds['indent_y'][1]);
$pos = $start_pos;
$cache = array("x" => 0, "y" => 0);
$step_y = ($bounds['height']-$bounds['indent_y'][0]-$bounds['indent_y'][1]) / 10;
if ($step_y < 15)
$step_y = 15;
// TSGK MAP TEXT
$last_map = "";
$last_map_posx = 0;
$bk_color = 0;
global $gray_border;
if (($first_entry == 1) && ($make_grid > 0) && ($server_load_type == 1)) {
foreach ($data_array as $key => $entry) {
if (($entry['map'] !== $last_map) || ($pos['x'] <= ($bounds['indent_x'][0]+1) )) {
if ($last_map == "") {
$last_map = $entry['map'];
$last_map_posx = $pos['x'];
} else {
$last_map = $entry['map'];
while ($last_map_posx > $pos['x']) {
if (($bk_color % 2) == 0) {
imageline($image, $last_map_posx, $bounds['indent_y'][0]+1, $last_map_posx, $bounds['height']-$bounds['indent_y'][1]-1, $color[4]);
}
$last_map_posx--;
}
$bk_color++;
imageline($image, $pos['x']+1, $bounds['indent_y'][0]+1, $pos['x']+1, $bounds['height']-$bounds['indent_y'][1]-1, $gray_border);
$last_map_posx = $pos['x'];
}
}
$pos['x'] -= 3;
if ($pos['x'] < $bounds['indent_x'][0])
break;
}
}
// END TSGK MAP TEXT
if ($make_grid > 0) {
$step_diff = 0;
$step_width = 0;
while ($step_diff < 15) {
$step_width++;
if ($max_pos_y[$max_index] % $step_width == 0) {
$steps = $max_pos_y[$max_index] / $step_width;
if ($steps > 0)
$step_diff = ($bounds['height']-$bounds['indent_y'][0]-$bounds['indent_y'][1]) / $steps;
else
$step_diff = 15;
} else {
$step_diff = 0;
}
}
for ($i=1; $i<$steps; $i++) {
$temp_y = (($bounds['height']-$bounds['indent_y'][0]-$bounds['indent_y'][1]) - ((($bounds['height']-$bounds['indent_y'][0]-$bounds['indent_y'][1]) / $max_pos_y[$max_index]) * ($i*$step_width))) + $bounds['indent_y'][0];
if ($temp_y > $bounds['indent_y'][0]+5)
image_dashed_line($image, $bounds['indent_x'][0]+1,
$temp_y,
($bounds['width']-$bounds['indent_x'][1]-1),
$temp_y,
array($color[4], $color[4], $color[4], -1, -1, -1));
imageline($image, $bounds['indent_x'][0]+1, $temp_y, $bounds['indent_x'][0]+4, $temp_y, $color[3]);
if ($max_pos_y[$max_index] > 10000) {
$str = sprintf("%.0fk", ($i*$step_width) / 1000);
} else {
$str = sprintf("%.0f", $i*$step_width);
}
$str_pos = $bounds['indent_x'][0] - (imagefontwidth(1) * strlen($str)) - 2;
imagestring($image, 1, $str_pos, $temp_y-3, $str, $color[2]);
}
if ($max_pos_y[$max_index] > 10000)
$str = sprintf("%.0fk", $max_pos_y[$max_index] / 1000);
else
$str = sprintf("%.0f", $max_pos_y[$max_index]);
$str_pos = $bounds['indent_x'][0] - (imagefontwidth(1) * strlen($str)) - 2;
imagestring($image, 1, $str_pos, $bounds['indent_y'][0]-3, $str, $color[2]);
}
$last_month = 0;
$last_month_timestamp = 0;
$last_day = 0;
$last_day_timestamp = 0;
$first_timestamp = 0;
$first_day = 0;
switch ($server_load_type) {
case 1 : $mov_avg_precision = 5;
break;
case 2 : $mov_avg_precision = 5;
break;
case 3 : $mov_avg_precision = 10;
break;
case 4 : $mov_avg_precision = 10;
break;
default: $mov_avg_precision = 1;
break;
}
$mov_avg_array = array();
$mov_avg_value = 0;
$mov_avg_display_value = array();
$i = 0;
while (($i < count($data_array)) && ($i < $mov_avg_precision / 2)) {
$entry = $data_array[$i];
$mov_avg_array[] = (($bounds['height']-$bounds['indent_y'][0]-$bounds['indent_y'][1]) - ((($bounds['height']-$bounds['indent_y'][0]-$bounds['indent_y'][1]) / $max_pos_y[$max_index]) * $entry[$name])) + $bounds['indent_y'][0];
$mov_avg_display_value[] = $entry[$name];
$i++;
}
// TSGK
$last_map = "";
$last_map_posx = 0;
$bk_color = 0;
// TSGK
foreach ($data_array as $key => $entry) {
$pos['y'] = (($bounds['height']-$bounds['indent_y'][0]-$bounds['indent_y'][1]) - ((($bounds['height']-$bounds['indent_y'][0]-$bounds['indent_y'][1]) / $max_pos_y[$max_index]) * $entry[$name])) + $bounds['indent_y'][0];
// TSGK
$maptext = imagecolorallocate($image, 96, 96, 96);
if(!isset($entry['map']))
$entry['map']="";
if (($first_entry == 2) && ($server_load_type == 1)) {
if ($entry['map'] !== $last_map) {
if ($last_map == "") {
$last_map = $entry['map'];
$last_map_posx = $pos['x'];
if ($entry['map'] != "") {
$str_height = $bounds['indent_y'][0] + (imagefontwidth(1) * strlen($entry['map'])) + 2;
imagestringup($image, 1, $pos['x']-8, $str_height, $entry['map'], $maptext);
}
} else {
$last_map = $entry['map'];
$str_height = $bounds['indent_y'][0] + (imagefontwidth(1) * strlen($entry['map'])) + 2;
imagestringup($image, 1, $pos['x']-8, $str_height, $entry['map'], $maptext);
$last_map_posx = $pos['x'];
}
}
}
// TSGK
$mov_avg_array[] = $pos['y'];
$mov_avg_value = $pos['y'];
if (count($mov_avg_array) > $mov_avg_precision)
array_shift($mov_avg_array);
$mov_avg_sum = 0;
$mov_avg_display_sum = 0;
foreach ($mov_avg_array as $mov_avg_entry)
$mov_avg_sum += $mov_avg_entry;
$mov_avg_value = sprintf("%d", ($mov_avg_sum / count($mov_avg_array)));
$pos['y'] = $mov_avg_value;
if ($key > 0) {
imageline($image, $cache['x'], $cache['y'], $pos['x'], $pos['y'], $color[0]);
}
if ($key == 0) {
foreach ($mov_avg_display_value as $mov_avg_display_entry)
$mov_avg_display_sum += $mov_avg_display_entry;
$display_value = sprintf("%d", ($mov_avg_display_sum / count($mov_avg_display_value)));
if ($display_value > 10000)
$str = sprintf("%.1fk", $display_value / 1000);
else
if ($name !== "act_players")
$str = sprintf("%.0f", $display_value);
else
$str = sprintf("%.1f", $display_value);
imagestring($image, 1, $pos['x']+2, $pos['y']-4, $str, $color[2]);
}
if ($first_timestamp == 0)
$first_timestamp = $entry['timestamp'];
$this_month = date("m", $entry['timestamp']);
if ($this_month > $last_month+1)
$last_month = $this_month+1;
if ($last_month == 0) {
$last_month = $this_month;
$last_month_timestamp = $entry['timestamp'];
}
if ($last_month == $this_month)
$last_month_timestamp = $entry['timestamp'];
$this_day = date("d", $entry['timestamp']);
if ($this_day > $last_day+1)
$last_day = $this_day+1;
if ($last_day == 0) {
$last_day = $this_day;
$last_day_timestamp = $entry['timestamp'];
}
if ($last_day == $this_day)
$last_day_timestamp = $entry['timestamp'];
switch ($server_load_type) {
case 1:
if (($write_timestamp > 0) && ($key > 0 && $key % 12 == 0)) {
image_dashed_line($image, $pos['x'], $pos['y'], $pos['x'], $bounds['height']-$bounds['indent_y'][1], array($color[1], $color[1], $color[1], -1, -1, -1));
$str = date("H:i", $entry['timestamp']);
imagestring($image, 1, $pos['x']-10, $bounds['height']-$bounds['indent_y'][1]+3, $str, $color[2]);
}
break;
case 2:
if (($write_timestamp > 0) && ($last_day > $this_day)) {
$last_day = $this_day;
if ($bounds['width']-$bounds['indent_x'][1]-$pos['x'] > 120)
$first_day++;
if ($first_day > 0) {
image_dashed_line($image, $pos['x'], $pos['y'], $pos['x'], $bounds['height']-$bounds['indent_y'][1], array($color[1], $color[1], $color[1], -1, -1, -1));
$first_day++;
if ($last_day_timestamp == 0)
$last_day_timestamp = $first_timestamp;
$str = date("l", $last_day_timestamp);
imagestring($image, 1, $pos['x']-15, $bounds['height']-$bounds['indent_y'][1]+3, $str, $color[2]);
}
$first_day++;
}
break;
case 3:
if (($write_timestamp > 0) && ($last_day > $this_day)) {
$last_day = $this_day;
if ($bounds['width']-$bounds['indent_x'][1]-$pos['x'] > 0)
$first_day++;
if ($first_day > 0) {
image_dashed_line($image, $pos['x'], $pos['y'], $pos['x'], $bounds['height']-$bounds['indent_y'][1], array($color[1], $color[1], $color[1], -1, -1, -1));
if ($last_day_timestamp == 0)
$last_day_timestamp = $first_timestamp;
$str = date("d", $last_day_timestamp);
imagestring($image, 1, $pos['x']-5, $bounds['height']-$bounds['indent_y'][1]+3, $str, $color[2]);
}
}
break;
case 4:
if (($write_timestamp > 0) && ($last_month > $this_month)) {
$last_month = $this_month;
if ($bounds['width']-$bounds['indent_x'][1]-$pos['x'] > 30)
$first_day++;
if ($first_day > 0) {
image_dashed_line($image, $pos['x'], $pos['y'], $pos['x'], $bounds['height']-$bounds['indent_y'][1], array($color[1], $color[1], $color[1], -1, -1, -1));
$first_day++;
if ($last_month_timestamp == 0)
$last_month_timestamp = $first_timestamp;
$str = date("M", $last_month_timestamp);
imagestring($image, 1, $pos['x']-5, $bounds['height']-$bounds['indent_y'][1]+3, $str, $color[2]);
}
$first_day++;
}
break;
default:
if (($write_timestamp > 0) && ($key > 0 && $key % 12 == 0)) {
image_dashed_line($image, $pos['x'], $pos['y'], $pos['x'], $bounds['height']-$bounds['indent_y'][1], array($color[1], $color[1], $color[1], -1, -1, -1));
$str = date("H:i", $entry['timestamp']);
imagestring($image, 1, $pos['x']-10, $bounds['height']-$bounds['indent_y'][1]+3, $str, $color[2]);
}
break;
}
if ($dot > 0) {
imagesetpixel($image, $pos['x'], $pos['y'], $color[0]);
imagesetpixel($image, $pos['x']-1, $pos['y'], $color[0]);
imagesetpixel($image, $pos['x']-1, $pos['y']-1, $color[0]);
imagesetpixel($image, $pos['x']-1, $pos['y']+1, $color[0]);
imagesetpixel($image, $pos['x']+1, $pos['y'], $color[0]);
imagesetpixel($image, $pos['x']+1, $pos['y']-1, $color[0]);
imagesetpixel($image, $pos['x']+1, $pos['y']+1, $color[0]);
imagesetpixel($image, $pos['x'], $pos['y']-1, $color[0]);
imagesetpixel($image, $pos['x'], $pos['y']+1, $color[0]);
} else {
imagesetpixel($image, $pos['x'], $pos['y'], $color[0]);
}
$cache['x'] = $pos['x'];
$cache['y'] = $pos['y'];
$step_x = 3;
if ($bar_type==2) {
// skalieren auf anzahl Tage
$step_x = round( ($bounds['width']-$bounds['indent_x'][1]-$bounds['indent_x'][0]) / $deletedays );
}
if ($bar_type==3 || $bar_type==4) {
// skalieren
$step_x = 5;
}
$pos['x'] -= $step_x;
if ($pos['x'] < $bounds['indent_x'][0])
break;
}
}
?>