HL SS

raspi 04.05.02 12:10

Half-Life -serverin statistiikat

 Tekstiversio  Arvo: 2 (5 ääntä)  Äänestä: +  -
<?php
/*
Imutin HL SDK:n ja tein tämän sen pohjalta.
En anna mitään tukea tälle skriptille.

-=|[ version 0.5b2 ]|=-

todo:
- tarkistetaan onko serveri elossa
- ping
- pelaajien sorttaus nimen, fraggien ja ajan mukaan
- bugikorjauksia
- optimointia
- formi, johon voi itse kirjoitella osoitteen
- ..

Half-Life (c) (r) (tm) Valve & Sierra

pekkajarvinen@kolumbus.fi
*/


// if (!isset($host) && !isset($port) && !is_numeric($port) && $port != "" && $host != "") {
// asetukset:
  $use_form = 0; // 1/0 (on/off) käytetäänkö formia, mihin voi kirjoittaa serverin
  $host = "tfc2.hl.peliportti.net"; // serverin osoite (IP:kin käy)
  $port = "27015"// portti
  // $sort_default = "frags"; // frags/time/name [todo]
  $show_rules = 0; // 0/1 näytetäänkö säännöt?
  $main_table_settings = 'border="0" cellspacing="0" cellpadding="1" width="*" align="center"';
  $table_settings = 'border="0" cellspacing="0" cellpadding="2" align="center"';
//}

  $mods = array(
    "dod" => ", Day of Defeat",
    "cstrike" => ", Counter-Strike",
    "tfc" => ", Team Fortress Classic",
    "gearbox" => ", Opposing Force",
    "valve" => ""
  );


/* ****************************************************************************************************************************************************** */
/* ****************************************************************************************************************************************************** */
/* ****************************************************************************************************************************************************** */

function getnull ($src) {
  $data = ""; // alustetaan
  $out = ""// alustetaan

  while($data != "\0") { // luetaan kunnes tulee \0 (null)
    $data = fread($src, 1); // luetaan yksi tavu
    $out .= $data;
  }

  return substr($out, 0, -1); // \0 (NULL, NIL, NUL, ..) pois lopusta
}

/* ****************************************************************************************************************************************************** */

function hlsend ($udp, $str) { // lähettää serverille tauhkaa
  fwrite($udp, "\377\377\377\377${str}\0\0"); // tunketaan roskaa serverille
  fread($udp, 4); // serveri palauttaa turhaa roskaa (4 x 0xFF)
}

/* ****************************************************************************************************************************************************** */

$fp = fsockopen("udp://${host}", $port, $errno, $errstr); // avataan UDP:tä käyttävä socketti
if (!$fp)
{
  echo "ERROR: $errno - $errstr<br>\n"; // virhe!11
} else {

/* ****************************************************************************************************************************************************** */

  // PING
  hlsend($fp, "ping"); // lähetetään serverille
  $hl["ping_j"] = fread($fp, 1); // 'j'
  if ($hl["ping_j"] != "j") {die ("ping ei toimi");}

/* ****************************************************************************************************************************************************** */

  /*
  // INFO - vanha protokolla
  hlsend($fp, "info");
  fread($fp, 1); // 'c'
  $hl["address"] = getnull($fp);
  $hl["name"] = getnull($fp);
  $hl["map"] = getnull($fp);
  $hl["dir"] = getnull($fp);
  $hl["description"] = getnull($fp);
  $hl["current_players"] = ord(fread($fp, 1));
  $hl["max_players"] = ord(fread($fp, 1));
  $hl["protocol"] = ord(fread($fp, 1));
  */


/* ****************************************************************************************************************************************************** */

  // DETAILS - uusi protokolla
  hlsend($fp, "details")// lähetetään serverille
  fread($fp, 2); // roskaa

  $hl["address"] = getnull($fp);                // IP osoite
  $thost = split(":", $hl["address"]);          // temp
  $hl["hosti"] = gethostbyaddr($thost[0]);      // hosti
  unset($thost);
  $hl["name"] = getnull($fp);                   // nimi
  $hl["map"] = getnull($fp);                    // kenttä
  $hl["dir"] = getnull($fp);                    // hakemisto, esim. cstrike

  foreach ($mods as $modi => $modinimi)
  {
    if ($hl["dir"] == $modi) {$hl["dir2mod"] = $modinimi;}
    if (!isset($hl["dir2mod"])) {$hl["dir2mod"] = "";}
  }

  $hl["description"] = getnull($fp);            // kuvaus
  $hl["current_players"] = ord(fread($fp, 1))// monta pelaajaa pelaamassa
  $hl["max_players"] = ord(fread($fp, 1));      // maksimimäärä pelaajia
  $hl["protocol"] = ord(fread($fp, 1));         // protokollan versio
  $hl["type"] = fread($fp, 1);                  // l/d (listen/dedicated)
  $hl["os"] = fread($fp, 1);                    // l/w (linux/windows)
  $hl["pass"] = ord(fread($fp, 1));             // 0/1
  $hl["mod"] = ord(fread($fp, 1));              // 0/1
  if ($hl["os"] == "w") {$hl["os"] = "Windows";} else {$hl["os"] = "Linux";}
  if ($hl["type"] == "d") {$hl["type"] = "Dedicated";} else {$hl["type"] = "Listen";}
  if ($hl["pass"] == 1) {$hl["pass"] = "Yes";} else {$hl["pass"] = "No";}

  if ($hl["mod"] == 1)
  {
    $hl["mod_info"] = getnull($fp);                   // info www site
    $hl["mod_get"] = getnull($fp);                    // ftp site
    $hl["mod_version"] = unpack("L", fread($fp, 4))// modin versio
    $hl["mod_size"] = unpack("l", fread($fp, 4));     // modin koko
    $hl["mod_sso"] = ord(fread($fp, 1));              // server side only? 0/1
    $hl["mod_csd"] = ord(fread($fp, 1));              // requires custom client side .dll? 0/1
    if ($hl["mod_sso"] == 1) {$hl["mod_sso"] = "Yes";} else {$hl["mod_sso"] = "No";}
    if ($hl["mod_csd"] == 1) {$hl["mod_csd"] = "Yes";} else {$hl["mod_csd"] = "No";}
    $hl["mod"] = "Yes";
  }
  else
  {
    $hl["mod_info"] = "";
    $hl["mod_get"] = "";
    $hl["mod_version"] = "";
    $hl["mod_size"] = "";
    $hl["mod_sso"] = "";
    $hl["mod_csd"] = "";
    $hl["mod"] = "None";
  }

/* ****************************************************************************************************************************************************** */

  // PLAYERS
  hlsend($fp, "players"); // lähetetään serverille
  fread($fp, 3); // roskaa + 'D'
  $hl["current_players"] = ord(fread($fp, 1)); // monta pelaajaa

  if ($hl["current_players"] > 0)
  {
    for($i = 0; $i < $hl["current_players"]; $i++)
    {
      fread($fp, 1); // pelaajan numero, turha tieto

      $plyr = htmlentities(getnull($fp)); // pelaajan nimi
      $frag = unpack("L", fread($fp, 4)); // fragit
      $time = unpack("f", fread($fp, 4)); // aika (float)
      $aika = mktime(0, 0, $time[""]);
      $aika = date("H:i:s", $aika);

      // tungetaan tiedot taulukkoon:
      $hl_players[] = array(
        "frags" => $frag[""],
        "name" => $plyr,
        "time" => $aika
      );

      unset($plyr);
      unset($frag);
      unset($time);
      unset($aika);

    }
  }

/* ****************************************************************************************************************************************************** */

  if ($show_rules == 1) {
    // RULES
    hlsend($fp, "rules"); // lähetetään serverille
    fread($fp, 1); // 'e', turha(?)
    $hl["number_of_rules"] = unpack("s", fread($fp, 2)); // kuinka monta sääntöä

    if ($hl["number_of_rules"][""] > 0) {
      for($i = 0; $i < $hl["number_of_rules"][""]; $i++) {
        $hl["rule_name"][] = getnull($fp)// säännön nimi
        $hl["rule_value"][] = getnull($fp); // säännön asetus
      }
    }

  }

/* ****************************************************************************************************************************************************** */

  fclose($fp)// suljetaan yhteys

}

/* ****************************************************************************************************************************************************** */
/* ****************************************************************************************************************************************************** */
/* ****************************************************************************************************************************************************** */
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <title>Half-Life Server Statistics PHP by raspi 2002</title>
  <style type="text/css">
  <!--
    /* CSS */

    body
    {
      background-color: #204060;
      margin: 0;
      padding: 0;
    }

    a:link
    {
    color: #E0E0E0;
    }

    a:visited
    {
      color: #E0E0E0;
    }

    a:hover
    {
      color: #FFFFFF;
    }

    a:active
    {
      color: #E0E0E0;
    }

    td
    {
      /* border: 0px solid #000000; */
      /* border-right: 1px solid; */
      background-color: #406080;
    }

    tr
    {
      border-width:0px;
      background-color: #FFFFFF;
    }

    table
    {
      border-width: 0px;
      background-color: #2020F0;
    }

    td.eka
    {
      background-color: #406080;
    }

    td.toka
    {
      background-color: #305070;
    }

    table.paatable
    {
      border-width:0px;
      background-color: #000000;
    }

    tr.paatr
    {
      border-width:0px;
      background-color: #808080;
    }

    td.paatd
    {
      border-width:0px;
      background-color: #000000;
    }

    div.keskelle
    {
      text-align: center;
    }

  -->
  </style>
</head>
<body>
<br>
<div align="center">

<!-- Main table -->
<table class="paatable" <?php echo $main_table_settings;?>>

<?php
// todo..
if ($use_form == 1)
{
  echo "<tr class=\"paatr\">\n";
  echo "<td class=\"paatd\">\n";
  echo "  <!-- Form -->\n";
  echo "  <table $table_settings;>\n";
  echo "    <tr>\n";
  echo "      <td>\n";
  echo "        <h3>Get information:</h3>\n";
  echo "      </td>\n";
  echo "    </tr>";
  echo "    <tr>\n";
  echo "      <td>\n";
  echo "        <form>\n";
  echo "          Host:\n";
  echo "          <input type=\"text\" name=\"host\" size=\"30\" value=\"$host\">\n";
  echo "          Port:\n";
  echo "          <input type=\"text\" name=\"port\" size=\"5\" value=\"$port\">\n";
  echo "          <input type=\"submit\" value=\" ok \">\n";
  echo "        </form>\n";
  echo "      </td>\n";
  echo "    </tr>\n";
  echo "  </table>\n";
  echo "</td>\n";
  echo "</tr>\n";
}
?>

<tr class="paatr">
<td class="paatd">

  <!-- Server information -->
  <table <?php echo $table_settings;?>>
    <tr><td colspan="2"><h3>Server information</h3></tr>
    <tr><td><b>Address:</b></td><td><?php echo "{$hl["hosti"]} ({$hl["address"]})";?></td></tr>
    <tr><td><b>Name:</b></td><td><?php echo $hl["name"];?></td></tr>
    <tr><td><b>Description:</b></td><td><?php echo $hl["description"];?></td></tr>
    <tr><td><b>Mod:</b></td><td><?php echo "{$hl["mod"]} {$hl["dir2mod"]}";?></td></tr>
    <tr><td><b>Map:</b></td><td><?php echo $hl["map"];?></td></tr>
    <tr><td><b>Number of players:</b></td><td><?php echo "{$hl["current_players"]}/{$hl["max_players"]}";?></td></tr>
    <tr><td><b>Password:</b></td><td><?php echo $hl["pass"];?></td></tr>
  </table>

</td>
</tr>

<tr class="paatr">
<td class="paatd">

<?php
// listataan pelaajat
if ($hl["current_players"] > 0) {
  echo "<!-- Players -->\n";
  echo "<table $table_settings>\n";
  echo "  <tr><td colspan=\"3\"><h3>Players</h3></td></tr>\n";
  echo "  <tr>\n";
  echo "    <td><b><a href=\"?sortby=name\">Name</a></b></td>\n";
  echo "    <td><b><a href=\"?sortby=time\">Time</a></b></td>\n";
  echo "    <td><b><a href=\"?sortby=frags\">Frags</a></b></td>\n";
  echo "  </tr>\n";

  for ($i = 0; $i < $hl["current_players"]; $i++) {

    if ($i % 2)
    {
      echo "  <tr>\n";
      echo "    <td class=\"eka\">{$hl_players[$i]["name"]}</td>\n";
      echo "    <td class=\"eka\">{$hl_players[$i]["time"]}</td>\n";
      echo "    <td class=\"eka\"><b>{$hl_players[$i]["frags"]}</b></td>\n";
      echo "  </tr>\n";
    }
    else
    {
      echo "  <tr>\n";
      echo "    <td class=\"toka\">{$hl_players[$i]["name"]}</td>\n";
      echo "    <td class=\"toka\">{$hl_players[$i]["time"]}</td>\n";
      echo "    <td class=\"toka\"><b>{$hl_players[$i]["frags"]}</b></td>\n";
      echo "  </tr>\n";
    }

  }
}
elseif ($hl["current_players"] == 0)
{
  echo "<!-- Players -->\n";
  echo "<table $table_settings>\n";
  echo "  <tr><td colspan=\"3\"><h3><b>NO Players</b></h3></td></tr>\n";
}
?>
  </table>

</td>
</tr>

<?php
if ($show_rules == 1) {
  echo "<tr class=\"paatr\">\n";
  echo "<td class=\"paatd\">\n";
  echo "<!-- Rules -->\n";
  echo "<table $table_settings;>\n";
  echo "  <tr><td colspan=\"2\"><h3>Rules</h3></td></tr>\n";
  echo "  <tr>\n";
  echo "    <td><b>Rule name</b></td>\n";
  echo "    <td><b>Rule setting</b></td>\n";
  echo "  </tr>\n";

  if ($hl["number_of_rules"][""] > 0) {
    for($i = 0; $i < $hl["number_of_rules"][""]; $i++) {

      if ($i % 2)
      {
        echo "  <tr>\n";
        echo "    <td class=\"eka\">{$hl["rule_name"][$i]}</td>\n";
        echo "    <td class=\"eka\">{$hl["rule_value"][$i]}</td>\n";
        echo "  </tr>\n";
      }
      else
      {
        echo "  <tr>\n";
        echo "    <td class=\"toka\">{$hl["rule_name"][$i]}</td>\n";
        echo "    <td class=\"toka\">{$hl["rule_value"][$i]}</td>\n";
        echo "  </tr>\n";
      }

    }
  }

  echo "</table>\n";
  echo "</td>\n";
  echo "</tr>\n";

}
?>

  <tr class="paatr">
    <td class="paatd">

      <table <?php echo $table_settings;?>>
        <tr>
          <td>
            by <a href="mailto:pekkajarvinen@kolumbus.fi">raspi</a> 2002<br>
          </td>
        </tr>
      </table>

    </td>
  </tr>

</table>
</div>
</body>
</html>

empty 16:31 3.9.02 
tein tuosta joskus aikoinaan sellaisen version joka hakee monen serverin tiedot:

http://www.ahjteam.com/hl/hl.php

sorsa:
http://www.ahjteam.com/hl/sorsa.php
Rap1ds 00:52 26.10.02 
Mitenköhän sais vielä näkyviin Fragien lisäks pelaajien kuolemat?
empty 16:16 19.5.03 
jotkut ne osaa :<
empty 05:22 25.6.03 
aivan sairaan kauan kestää haku :E
SluvE 22:49 19.3.05 
VERC Collectivesta löytyy Half-Life-servereiden tietojen hakemisesta lisää.