Unsupported PHP app for analysing and displaying stats for Team Fortress 2
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

eventhistory.php 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <?PHP
  2. function eventSort($a, $b) {
  3. return strtotime($b['time']) - strtotime($a['time']);
  4. }
  5. function showEventHistory($playerid) {
  6. $events = array();
  7. // Kills
  8. $sql = '
  9. SELECT
  10. weapon_name,
  11. kill_timestamp,
  12. rp1.player_id AS killerID,
  13. rp1.roleperiod_team AS killerTeam,
  14. c1.class_name AS killerClass,
  15. s1.session_alias AS killerName,
  16. rp2.player_id AS victimID,
  17. rp2.roleperiod_team AS victimTeam,
  18. c2.class_name AS victimClass,
  19. s2.session_alias AS victimName,
  20. rp3.player_id AS assistID,
  21. rp3.roleperiod_team AS assistTeam,
  22. c3.class_name AS assistClass,
  23. s3.session_alias AS assistName
  24. FROM
  25. kills
  26. NATURAL JOIN weapons
  27. INNER JOIN roleperiods AS rp1 ON kill_killer = rp1.roleperiod_id
  28. INNER JOIN sessions AS s1 ON rp1.session_id = s1.session_id
  29. INNER JOIN classes AS c1 ON rp1.class_id = c1.class_id
  30. INNER JOIN roleperiods AS rp2 ON kill_victim = rp2.roleperiod_id
  31. INNER JOIN sessions AS s2 ON rp2.session_id = s2.session_id
  32. INNER JOIN classes AS c2 ON rp2.class_id = c2.class_id
  33. LEFT OUTER JOIN roleperiods AS rp3 ON kill_assist = rp3.roleperiod_id
  34. LEFT OUTER JOIN sessions AS s3 ON rp3.session_id = s3.session_id
  35. LEFT OUTER JOIN classes AS c3 ON rp3.class_id = c3.class_id
  36. WHERE
  37. (
  38. rp1.player_id = ' . $playerid .'
  39. OR rp2.player_id = ' . $playerid . '
  40. OR rp3.player_id = ' . $playerid . '
  41. )
  42. ORDER BY kill_timestamp DESC
  43. LIMIT 0,100';
  44. $res = mysql_query($sql) or print(mysql_error());
  45. while ($row = mysql_fetch_assoc($res)) {
  46. $row['time'] = $mintime = $row['kill_timestamp'];
  47. $events[] = $row;
  48. }
  49. // Sessions
  50. $sql = '
  51. SELECT
  52. session_starttime,
  53. session_endtime,
  54. session_alias,
  55. map_name
  56. FROM
  57. sessions
  58. NATURAL JOIN games
  59. NATURAL JOIN maps
  60. WHERE
  61. (
  62. session_starttime > \'' . $mintime . '\'
  63. OR session_endtime > \'' . $mintime . '\'
  64. )
  65. AND player_id = ' . $playerid . '
  66. ORDER BY session_starttime DESC
  67. LIMIT 0,100';
  68. $res = mysql_query($sql) or print(mysql_error());
  69. while ($row = mysql_fetch_assoc($res)) {
  70. if (strtotime($row['session_starttime']) > strtotime($mintime)) {
  71. $row['time'] = $row['session_starttime'];
  72. $events[] = $row;
  73. }
  74. if (strtotime($row['session_endtime']) > strtotime($mintime)) {
  75. $row['time'] = $row['session_endtime'];
  76. $events[] = $row;
  77. }
  78. }
  79. // Roles
  80. $sql = 'SELECT class_name, class_displayname, session_alias, roleperiod_team, roleperiod_starttime FROM roleperiods NATURAL JOIN sessions NATURAL JOIN classes WHERE player_id = ' . $playerid . ' AND roleperiod_starttime > \'' . $mintime . '\' ORDER BY roleperiod_starttime DESC LIMIT 0,100';
  81. $res = mysql_query($sql);
  82. while ($row = mysql_fetch_assoc($res)) {
  83. $row['time'] = $row['roleperiod_starttime'];
  84. $events[] = $row;
  85. }
  86. usort($events, 'eventSort');
  87. echo '<table class="events"><tr><th>Time</th><th colspan="7">Event</th></tr>';
  88. $i = 0;
  89. foreach (array_slice($events, 0, 100) as $event) {
  90. echo '<tr', ++$i % 2 == 0 ? ' class="even"' : '', '><td class="time">', str_replace(' ', '<br>', $event['time']), '</td>';
  91. if (isset($event['kill_timestamp'])) {
  92. displayKill($event, $playerid);
  93. } else if (isset($event['session_starttime'])) {
  94. displaySession($event);
  95. } else if (isset($event['roleperiod_starttime'])) {
  96. displayRoleChange($event);
  97. }
  98. echo '</tr>', "\n";
  99. }
  100. echo '</table>';
  101. }
  102. function displayRoleChange($event) {
  103. $text = getTeam($event['roleperiod_team']) . ' ' . strtolower($event['class_displayname']);
  104. echo '<td colspan="7"><img src="', sprintf(URL_CLASS, getTeam($event['roleperiod_team']), $event['class_name']);
  105. echo '" alt="', $text, '"> ', htmlentities($event['session_alias'], ENT_COMPAT, 'UTF-8');
  106. echo ' changed to a ', $text, '</td>';
  107. }
  108. function displayKill($event, $playerid) {
  109. $me = null;
  110. if ($event['killerID'] == $playerid) {
  111. $me = 'killer';
  112. } else if ($event['victimID'] == $playerid) {
  113. $me = 'victim';
  114. } else {
  115. $me = 'assist';
  116. }
  117. call_user_func('displayKill' . ucfirst($me), $event);
  118. }
  119. function getTeam($team) {
  120. switch ((int) $team) {
  121. case 1: return 'red';
  122. case 2: return 'blue';
  123. }
  124. }
  125. function displayPerson($event, $who, $link = true, $link2 = true) {
  126. echo '<td', ($who != 'killer' || $event['assistID'] == 0) ? ' colspan="2"' : '', '><img src="', sprintf(URL_CLASS, getTeam($event[$who . 'Team']), $event[$who . 'Class']);
  127. echo '" alt="' , getTeam($event[$who . 'Team']), ' ', $event[$who . 'Class'], '"> ';
  128. if ($link) {
  129. echo '<a href="player.php?id=' . $event[$who . 'ID'] . '">';
  130. }
  131. echo htmlentities($event[$who . 'Name'], ENT_COMPAT, 'UTF-8');
  132. if ($link) {
  133. echo '</a>';
  134. }
  135. if ($who == 'killer' && $event['assistID'] > 0) {
  136. echo ',</td><td><img src="', sprintf(URL_CLASS, getTeam($event['assistTeam']), $event['assistClass']);
  137. echo '" alt="' , getTeam($event['assistTeam']), ' ', $event['assistClass'], '"> ';
  138. if ($link2) {
  139. echo '<a href="player.php?id=' . $event['assistID'] . '">';
  140. }
  141. echo htmlentities($event['assistName'], ENT_COMPAT, 'UTF-8');
  142. if ($link2) {
  143. echo '</a>';
  144. }
  145. }
  146. echo '</td>';
  147. }
  148. function displayWeapon($event) {
  149. echo '<td><img src="', sprintf(URL_WEAPON, $event['weapon_name']), '"></td>';
  150. }
  151. function displayKillKiller($event) {
  152. displayPerson($event, 'killer', false);
  153. echo '<td>killed</td>';
  154. displayPerson($event, 'victim');
  155. echo '<td>with</td>';
  156. displayWeapon($event);
  157. }
  158. function displayKillVictim($event) {
  159. displayPerson($event, 'killer');
  160. echo '<td>killed</td>';
  161. displayPerson($event, 'victim', false);
  162. echo '<td>with</td>';
  163. displayWeapon($event);
  164. }
  165. function displayKillAssist($event) {
  166. displayPerson($event, 'killer', true, false);
  167. echo '<td>killed</td>';
  168. displayPerson($event, 'victim');
  169. echo '<td>with</td>';
  170. displayWeapon($event);
  171. }
  172. function displaySession($event) {
  173. echo '<td colspan="7">';
  174. echo '<img src="', sprintf(URL_MAP, 'tiny', $event['map_name']);
  175. echo '" alt="', $event['map_name'], '" title="Map: ', $event['map_name'], '"> ';
  176. if ($event['session_starttime'] == $event['time']) {
  177. echo htmlentities($event['session_alias'], ENT_COMPAT, 'UTF-8'), ' joined the server';
  178. } else {
  179. echo htmlentities($event['session_alias'], ENT_COMPAT, 'UTF-8'), ' left the server';
  180. }
  181. echo '</td>';
  182. }
  183. ?>