google/stackoverflow で本当に長い間検索しましたが、答えが見つかりませんでした。Terrariaサーバーがオンラインかどうか、オンラインの場合は誰が接続しているかなどを確認するために画像を配置しようとしています. このソース コードは tshock.co の geek85 から入手しました。ソースは次のとおりです。
<?php
error_reporting(E_ERROR);
//variables
$ip = 'XXX.XXX.XXX.XXX';
$port = '7878'; //port of rest server, not terraria server
$json = json_decode(file_get_contents('http://'.$ip.':'.$port.'/status/'), true);
header('Content-Type: image/png');
$im = @imagecreatefrompng('terraria_online.png');
$font = 'visitor1.ttf';
//$font2 = 'fonts/visitor2.ttf';
$red = imagecolorallocate($im, 255, 24, 24);
$blue = imagecolorallocate($im, 50,50,255);
$black = imagecolorallocate($im, 10,10,10);
$purple = imagecolorallocate($im, 127,0,127);
$grey = imagecolorallocate($im, 50, 50, 50);
$white = imagecolorallocate($im, 255, 255, 255);
//server found and running
if ($json['status'] == '200')
{
// text in the grey box
$playerarray = explode(', ',$json['players']);
imagettftext($im, 18, 0, 31, 16, $grey, $font, $json['name']);
imagettftext($im, 18, 0, 30, 15, $red, $font, $json['name']);
imagettftext($im, 14, 0, 31, 34, $grey, $font, 'IP: '.$ip);
imagettftext($im, 14, 0, 30, 33, $black, $font, 'IP: '.$ip);
imagettftext($im, 14, 0, 31, 49, $grey, $font, 'Port: '.$json['port']);
imagettftext($im, 14, 0, 30, 48, $black, $font, 'Port: '.$json['port']);
imagettftext($im, 14, 0, 9, 71, $grey, $font, 'Joueurs en ligne: '.$json['playercount']);
imagettftext($im, 14, 0, 8, 70, $blue, $font, 'Joueurs en ligne: '.$json['playercount']);
// show VIPs' avatar
if ($json['playercount'] > 0)
{
//array of VIP players - (next step : a txt file with names and coordinates to parse...)
$vip = array('QcSeb','Marlin','Twingo','Gaston');
$num = count($vip);
for ($i=0; $i<$num; $i++)
{
if (in_array($vip[$i], $playerarray))
{
$player = @imagecreatefrompng('Images/'.strtolower($vip[$i]).'.png');//This line doesn't work for now
$long = imageSX($player);
$haut = imageSY($player);
switch ($vip[$i])
{
//here, it's a bit difficult: these are the coordinate where to place VIP players in the image.
case 'QcSeb':
$x = 350;
$y = 133;
break;
case 'Gaston':
$x = 300;
$y = 68;
break;
case 'Marlin':
$x = 261;
$y = 68;
break;
case 'Twingo':
$x = 307;
$y = 133;
break;
}
$ok = imagecopy($im,$player,$x,$y-$haut,0,0,$long,$haut);
}
}
// name of players (VIP or not)
$i = -1;
$j = 0;
// since my server only accept 8 players, I don't have any overflow control on the number of player's name to write but this code can do the work for any number of player (< to width of image / 75)
foreach( $playerarray as $player )
{
if ($i++ >= 6)
{
$i = 0;
$j++;
}
imagettftext($im, 11, 0, 11+($j*75), 101+($i*15), $grey, $font, $player);
imagettftext($im, 11, 0, 10+($j*75), 100+($i*15), $purple, $font, $player);
}
}
}
// offline or not "statut == 200"
else
{
$im = @imagecreatefrompng('terraria_offline.png');
imagettftext($im, 18, 0, 11, 31, $purple, $font, 'IP:'.$ip.':'.$port);
imagettftext($im, 18, 0, 10, 30, $grey, $font, 'IP:'.$ip.':'.$port);
imagettftext($im, 42, 17, 16, 131, $purple, $font, 'offline');
imagettftext($im, 42, 17, 15, 130, $black, $font, 'offline');
}
imagepng($im);
imagedestroy($im);
?>
私は 000webhost を使用しています:sebserver.comuf.com (/ServerStatus1.php)。http://XXX.XXX.XXX.XXX:7878/status/にアクセスすると、 次のようになります。
{
"status": "200",
"name": "TShock Server",
"port": "7777",
"playercount": "1",
"players": "QcSeb"
}
実際にサーバーにいるのは私だけだからです。
(XXX.XXX.XXX.XXX = 私の隠し IP :P)
これが私がやろうとしていることの例です: http://renagadez.square7.de/gen.php?ip=111.111.111.111&port=1111
事前にご協力いただきありがとうございます。