Jump to content
  • 0
Timokha

Guild emblems on Flux CP after HTTP release

Question

Hello,

 

After updating to the latest Hercules, 

The emblems work fine in game using API server,

But new emblems are now not displaying on the website (both bmp and gif formats).

Old emblems, which were set before the API server has been setuped, work well.

 

232133.png

 

Might be script cannot convert now data from SQL to image.

What was changed in emblem data or how it can be fixed?

I've tried also the latest FLUX CP codes, but still no results.

 

Share this post


Link to post
Share on other sites

6 answers to this question

Recommended Posts

  • 0

from server side changed mysql blob field size with emblem. Now image can be much bigger.

 

 

 

Share this post


Link to post
Share on other sites
  • 0
5 hours ago, 4144 said:

from server side changed mysql blob field size with emblem. Now image can be much bigger.

 

 

 

changing the size of emblem data on sql, will affect gif emblems right?.

 

Share this post


Link to post
Share on other sites
  • 0

Some time ago I adjusted the emblem display on the website, but I don't remember which file I modified. I think it was related to the imagecreatefrombmpstring function, but I could be wrong - it wasn't too difficult to fix it. Below I'm sending potential files that may have been changed, compare them with your own files. Also, pay attention to the PHP error logs - often the solution lies there.

 

\lib\Flux\EmblemExporter.php

<?php
require_once 'functions/imagecreatefrombmpstring.php';

/**
 *
 */
class Flux_EmblemExporter {
	/**
	 *
	 */
	public $loginAthenaGroup;
	
	/**
	 *
	 */
	public $athenaServers = array();
	
	/**
	 *
	 */
	public function __construct(Flux_LoginAthenaGroup $loginAthenaGroup)
	{
		$this->loginAthenaGroup = $loginAthenaGroup;
	}
	
	/**
	 *
	 */
	public function addAthenaServer(Flux_Athena $athenaServer)
	{
		if (!in_array($athenaServer, $this->loginAthenaGroup->athenaServers, true)) {
			throw new Flux_Error(
				"{$athenaServer->serverName} is not a valid char/map server defined in the {$this->loginAthenaGroup->serverName} group.");
		}
		
		$this->athenaServers[$athenaServer->serverName] = $athenaServer;
	}
	
	/**
	 *
	 */
	public function exportArchive()
	{
		$topDir  = $this->sanitizePathName($this->loginAthenaGroup->serverName);
		$tmpDir  = FLUX_DATA_DIR.'/tmp';
		$tmpFile = tempnam($tmpDir, 'zip');
		
		// Create zip archive.
		$zip = new ZipArchive();
		$zip->open($tmpFile, ZIPARCHIVE::OVERWRITE);
		$zip->addEmptyDir($topDir);
		
		foreach ($this->athenaServers as $athenaServer) {
			$athenaDir = $this->sanitizePathName($athenaServer->serverName);
			$zip->addEmptyDir("$topDir/$athenaDir");
			
			$sql = "SELECT name, emblem_data FROM {$athenaServer->charMapDatabase}.guild WHERE emblem_len > 0 ORDER BY name ASC";
			$sth = $athenaServer->connection->getStatement($sql);
			$sth->execute();
			
			$guilds = $sth->fetchAll();
			if ($guilds) {
				foreach ($guilds as $guild) {
					$emblemData  = @gzuncompress(pack('H*', $guild->emblem_data));
					$emblemImage = imagecreatefrombmpstring($emblemData);
					
					ob_start();
					imagepng($emblemImage);
					$data = ob_get_clean();
					
					$emblemName = sprintf('%s.png', $this->sanitizePathName($guild->name)); 
					$zip->addFromString("$topDir/$athenaDir/$emblemName", $data);
				}
			}
		}
		
		// Close archive.
		$zip->close();
		
		// Send out appropriate HTTP headers.
		$filename = urlencode(sprintf('%s-%s-emblems.zip', strtolower($topDir), date('Ymd')));
		header('Content-Type: application/zip');
		header('Content-Length: '.filesize($tmpFile));
		header("Content-Disposition: attachment; filename=$filename");
		
		// Read contents of the file.
		readfile($tmpFile);
		
		// Remove temporary file.
		unlink($tmpFile);
		exit;
	}
	
	/**
	 *
	 */
	private function sanitizePathName($pathName)
	{
		return preg_replace('/[^\w\d ]+/', '', $pathName);
	}
}
?>

 

\lib\functions\imagecreatefrombmpstring.php

<?php
/**
 * Convert a bmp string to Image resource
 * @param {string} $data - BMP string content
 * @return {resource} image resource
 */
function imagecreatefrombmpstring($data)
{
	// Read header
	extract( unpack("a2signature/x8/Voffset/x4/Vwidth/Vheight/x2/vbits", substr($data, 0, 30)));
	if ($signature !== 'BM') {
		return false;
	}


	// Create image
	$img = imagecreatetruecolor($width, $height);
	imagealphablending($img, false);
	imagesavealpha($img, true);


	// Load palette (if used)
	$paletteSize  = $offset - 54;
	$imagePalette = array();
	if ($paletteSize > 0 && $bits < 16) {
		$palette = unpack('C'. $paletteSize, substr($data, 54, $paletteSize));

		for ($i = 1, $p = 0; $i < $paletteSize; $i += 4, $p++ ) {
			$b = $palette[$i+0];
			$g = $palette[$i+1];
			$r = $palette[$i+2];
			$a = $palette[$i+3];

			// Magenta is transparent.
			if (($r & 0xf8 === 0xf8) && ($g === 0) && ($b & 0xf8 === 0xf8)) {
				$a = 127;
			}

			$imagePalette[$p] = imagecolorallocatealpha($img, $r, $g, $b, $a);
		}
	}

	// Read ImageData
	$skip      = ( 4 - ( (( ($bits * $width) + 7) >> 3 ) & 3 ) ) % 4;
	$size      = $width * $height * ($bits >> 3) + $skip * $height; 
	$imageData = unpack('C'. $size, substr($data, $offset, $size) );


	switch ($bits) {

		// Not an original DIB file ?
		default:
			return false;

		// 24 bits BMP
		case 24:
			for ($i = 1, $y = $height-1; $y > -1; $y--, $i += $skip) {
				for ($x = 0; $x < $width; $x++, $i+=3) {
					$b = $imageData[$i+0];
					$g = $imageData[$i+1];
					$r = $imageData[$i+2];

					if ($r === 255 && $g === 0 && $b === 255) {
						$c = imagecolorallocatealpha($img, $r, $g, $b, 127);
					}
					else {
						$c = imagecolorallocate($img, $r, $g, $b);
					}

					imagesetpixel($img, $x, $y, $c );
				}
			}
			break;


		// 8 bits BMP
		case 8:
			for ($i = 1, $y = $height-1; $y > -1; $y--, $i += $skip) {
				for ($x = 0; $x < $width; $x++, $i++) {
					imagesetpixel($img, $x, $y, $imagePalette[$imageData[$i]] );
				}
			}
			break;


		// 4 bits BMP
		case 4:
			for ($i = 1, $y = $height-1; $y > -1; $y--, $i += $skip) {
				for ($x = 0; $x < $width; $x+=2, $i++) {
					$byte = &$imageData[$i];
					imagesetpixel($img, $x+0, $y, $imagePalette[$byte >> 4  ]);
					imagesetpixel($img, $x+1, $y, $imagePalette[$byte & 0x0F]);
				}
			}
			break;


		// 1 bit BMP
		case 1:
			for ($i = 1, $y = $height-1; $y > -1; $y--, $i += $skip) {
				for ($x = 0; $x < $width; $x+=8, $i++) {
					$byte = &$imageData[$i];
					imagesetpixel($img, $x+0, $y, $imagePalette[ !!($byte & 0x80) ]);
					imagesetpixel($img, $x+1, $y, $imagePalette[ !!($byte & 0x40) ]);
					imagesetpixel($img, $x+2, $y, $imagePalette[ !!($byte & 0x20) ]);
					imagesetpixel($img, $x+3, $y, $imagePalette[ !!($byte & 0x10) ]);
					imagesetpixel($img, $x+4, $y, $imagePalette[ !!($byte & 0x08) ]);
					imagesetpixel($img, $x+5, $y, $imagePalette[ !!($byte & 0x04) ]);
					imagesetpixel($img, $x+6, $y, $imagePalette[ !!($byte & 0x02) ]);
					imagesetpixel($img, $x+7, $y, $imagePalette[ !!($byte & 0x01) ]);
				}
			}
			break;
	}


	return $img;
}

?>

 

\modules\guild\emblem.php

<?php
if (!defined('FLUX_ROOT')) exit;

function flux_get_default_bmp_data()
{
	$filename = sprintf('%s/emblem/%s', FLUX_DATA_DIR, Flux::config('MissingEmblemBMP'));
	if (file_exists($filename)) {
		return file_get_contents($filename);
	}
}

function flux_display_empty_emblem()
{
	$data = flux_get_default_bmp_data();
	header("Content-Type: image/bmp");
	header('Content-Length: '.strlen($data));
	echo $data;
	exit;
}

if (Flux::config('ForceEmptyEmblem'))
	flux_display_empty_emblem();

$serverName       = $params->get('login');
$athenaServerName = $params->get('charmap');
$guildID          = intval($params->get('id'));
$athenaServer     = Flux::getAthenaServerByName($serverName, $athenaServerName);

if (!$athenaServer || $guildID < 0)
	flux_display_empty_emblem();
else {
	if ($interval=Flux::config('EmblemCacheInterval')) {
		$interval *= 60;
		$dirname   = FLUX_DATA_DIR."/tmp/emblems/$serverName/$athenaServerName";
		$filename  = "$dirname/$guildID.png";
		
		if (!is_dir($dirname))
			if (Flux::config('RequireOwnership'))
				mkdir($dirname, 0700, true);
			else
				mkdir($dirname, 0777, true);
		elseif (file_exists($filename) && (time() - filemtime($filename)) < $interval) {
			header("Content-Type: image/png");
			header('Content-Length: '.filesize($filename));
			@readfile($filename);
			exit;
		}
	}
	
	$db  = $athenaServer->charMapDatabase;
	$sql = "SELECT emblem_len, emblem_data FROM $db.guild WHERE guild_id = ? LIMIT 1";
	$sth = $athenaServer->connection->getStatement($sql);
	$sth->execute(array($guildID));
	$res = $sth->fetch();
	
	if (!$res || !$res->emblem_len || is_null($res->emblem_data))
		flux_display_empty_emblem();
	else {
		$data = hex2bin($res->emblem_data);
		if ($data === false) {
			flux_display_empty_emblem();
			exit;
		}
	
		$signature = substr($res->emblem_data, 0, 4); // First 2 bytes, because it's in hex
		$image_type = "image/png"; // Default
	
		if ($signature === "4749") {
			$image_type = "image/gif";
		} elseif ($signature === "424D") {
			$image_type = "image/bmp";
			require_once 'functions/imagecreatefrombmpstring.php';
			$image = imagecreatefrombmpstring($data);
			if ($image === false) {
				flux_display_empty_emblem();
				exit;
			}
			// Reassign $data to the PNG image data
			ob_start();
			imagepng($image);
			$data = ob_get_contents();
			ob_end_clean();
		} elseif ($signature === "7801") {
			// Attempt zlib decompression
			$data = @gzuncompress($data);
			if ($data === false) {
				flux_display_empty_emblem();
				exit;
			}
			// Here, further identification of the data type may be needed
		}
	
		header("Content-Type: {$image_type}");
		header('Content-Length: '.strlen($data));
	
		echo $data;
		exit;
	}
}
?>

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.