• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

AAC Help Signatures MYAAC

dervin13

Active Member
Joined
Apr 26, 2008
Messages
458
Solutions
1
Reaction score
28
Hi, I don't know why but some error is occurring and "the image cannot be displayed because it contains erros" But I dont know how to see about this errors....

The image .png is been creating normally in cache but something is wrong showing then.

If someone can help me i'll be very greatfully

index
Code:
<?php
    if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
    {
        header('HTTP/1.0 304 Not Modified');
        /* PHP/webserver by default can return 'no-cache', so we must modify it */
        header('Cache-Control: public');
        header('Pragma: cache');
        exit;
    }

    require_once '../../common.php';
    require_once SYSTEM . 'functions.php';
    require_once SYSTEM . 'init.php';

    // Definitions
    define('SIGNATURES', TOOLS . 'signature/');
    define('SIGNATURES_BACKGROUNDS', 'images/backgrounds/');
    define('SIGNATURES_CACHE', CACHE . 'signatures/');
    define('SIGNATURES_DATA', SYSTEM . 'data/');
    define('SIGNATURES_FONTS', SIGNATURES . 'fonts/');
    define('SIGNATURES_IMAGES', SIGNATURES . 'images/');
    define('SIGNATURES_ITEMS', BASE . 'images/items/');

    if(!$config['signature_enabled'])
        die('Signatures are disabled on this server.');

    $file = trim(strtolower($config['signature_type'])) . '.php';
    if(!file_exists($file))
        die('ERROR: Wrong signature_type in config.');

    putenv('GDFONTPATH=' . SIGNATURES_FONTS);

    if(!isset($_REQUEST['name']))
        die('Please enter name as get or post parameter.');

    $name = stripslashes(ucwords(strtolower(trim($_REQUEST['name']))));
    $player = new OTS_Player();
    $player->find($name);

    if(!$player->isLoaded())
    {
        header('Content-type: image/png');
        readfile(SIGNATURES_IMAGES . 'nocharacter.png');
        exit;
    }

    if(!function_exists( 'imagecreatefrompng'))
    {
        header('Content-type: image/png');
        readfile(SIGNATURES_IMAGES . 'nogd.png');
        exit;
    }

    $cached = SIGNATURES_CACHE.$player->getId() . '.png';
    if(file_exists($cached) && (time() < (filemtime($cached) + (60 * $config['signature_cache_time']))))
    {
        header( 'Content-type: image/png' );
        readfile(SIGNATURES_CACHE . $player->getId().'.png');
        exit;
    }

    require $file;
    header('Content-type: image/png');
    $seconds_to_cache = $config['signature_browser_cache'] * 60;
    $ts = gmdate("D, d M Y H:i:s", time() + $seconds_to_cache) . " GMT";
    header('Expires: ' . $ts);
    header('Pragma: cache');
    header('Cache-Control: public, max-age=' . $seconds_to_cache);
    readfile(SIGNATURES_CACHE . $player->getId() . '.png');
?>

tibian
Code:
<?php
    defined('MYAAC') or die('Direct access not allowed!');

    $img = imagecreatefrompng(SIGNATURES_IMAGES . 'stats.png');
    if(!$img) {
        die('Error while using function imagecreatefrompng. Maybe you got php extension xdebug loaded?');
    }

    $font = SIGNATURES_FONTS . 'arialbd.ttf';
    $fontsize = 8;

    $title = imagecolorallocate($img, 160, 160, 160);
    $text = imagecolorallocate($img, 180, 180, 180);
    $bar = imagecolorallocate($img, 0, 0, 0);
    $barfill = imagecolorallocate($img, 200, 0, 0);
    $hpfill = imagecolorallocate($img, 200, 0, 0);
    $manafill = imagecolorallocate($img, 0, 0, 200);

    imagettftext($img, $fontsize, 0, 20, 11, $title, $font, $player->getName() . ' - ' . BASE_URL);

    // experience
    $needexp = OTS_Toolbox::experienceForLevel($player->getLevel() + 1);
    $experience = $player->getExperience();
    if($experience > $needexp) $experience = $needexp;
    imagettftext($img, $fontsize, 0, 15, 30, $text, $font, 'Experience');
    imagettftext($img, $fontsize, 0, 100, 30, $text, $font, number_format($experience)." (".number_format($needexp).")");

    // level
    imagettftext($img, $fontsize, 0, 15, 43, $text, $font, 'Level');
    imagettftext($img, $fontsize, 0, 100, 43, $text, $font, number_format($player->getLevel()));

    // experience bar
    $currLevelExp = OTS_Toolbox::experienceForLevel($player->getLevel());
    $nextLevelExp = OTS_Toolbox::experienceForLevel($player->getLevel() + 1);
    $levelPercent = 0;
    if($nextLevelExp > $currLevelExp)
        $levelPercent = (int)OTS_Player::getPercentLevel($experience - $currLevelExp, $nextLevelExp - $currLevelExp);

    imagerectangle($img, 14, 46, 166, 50, $bar);
    if($levelPercent > 0)
        imagefilledrectangle($img, 15, 47, $levelPercent * 1.5 + 15, 49, $barfill);

    imagettftext($img, $fontsize, 0, 170, 51, $text, $font, $levelPercent . '%');

    // vocation
    $vocation = 'Unknown';
    if(isset($config['vocations'][$player->getVocation()]))
        $vocation = $config['vocations'][$player->getVocation()];
    
    imagettftext($img, $fontsize, 0, 15, 62, $text, $font, 'Vocation');
    imagettftext($img, $fontsize, 0, 100, 62, $text, $font, $vocation);

    // hit points, Mana, Soul Points, Capacity
    $health = $player->getHealth();
    if($health > $player->getHealthMax())
        $health = $player->getHealthMax();

    $empty = imagecreatefrompng('images/empty.png');
    //imagerectangle($img, 39, 67, 141, 75, $bar);
    $fillhp = round($player->getHealth()/$player->getHealthMax() * 100);
    //imagefilledrectangle($img, 40, 68, 40+$fillhp, 74, $hpfill);
    $healthicon = imagecreatefrompng('images/hpicon.png');
    imagecopy($img, $healthicon, 15, 65, 0, 0, 12, 12);
    $healthfg = imagecreatefrompng('images/healthfull.png');
    imagecopy($img, $empty, 32, 65, 0, 0, 100, 12);
    imagecopy($img, $healthfg, 32, 65, 0, 0, $fillhp, 12);
    //imagettftext($img, $fontsize, 0, 15, 75, $text, $font, "Hit Points");
    imagettftext($img, $fontsize, 0, 140, 75, $text, $font, $player->getHealth());

    //imagerectangle($img, 39, 80, 141, 88, $bar);
    $mana = $player->getMana();
    if($mana > $player->getManaMax())
        $mana = $player->getManaMax();

    $fillmana = 0;
    if($player->getMana() > 0 && $player->getManaMax() > 0)
        $fillmana = round($player->getMana()/$player->getManaMax() * 100);

    //imagefilledrectangle($img, 40, 81, 40+$fillmana, 87, $manafill);
    $manaicon = imagecreatefrompng('images/manaicon.png');
    imagecopy($img, $manaicon, 15, 79, 0, 0, 12, 10);
    $manafg = imagecreatefrompng('images/manafull.png');
    imagecopy($img, $empty, 32, 78, 0, 0, 100, 12);
    imagecopy($img, $manafg, 32, 78, 0, 0, $fillmana, 12);
    //imagettftext($img, $fontsize, 0, 15, 88, $text, $font, "Mana");
    imagettftext($img, $fontsize, 0, 140, 88, $text, $font, $player->getMana());

    imagettftext($img, $fontsize, 0, 15, 101, $text, $font, 'Soul Points');
    imagettftext($img, $fontsize, 0, 100, 101, $text, $font, number_format($player->getSoul()));
    imagettftext($img, $fontsize, 0, 15, 114, $text, $font, 'Capacity');
    imagettftext($img, $fontsize, 0, 100, 114, $text, $font, number_format($player->getCap()));

    // magic Level
    imagettftext($img, $fontsize, 0, 15, 127, $text, $font, 'Magic Level');
    imagettftext($img, $fontsize, 0, 100, 127, $text, $font, number_format($player->getMagLevel()));

    // premium status
    $account = $player->getAccount();
    imagettftext($img, $fontsize, 0, 15, 140, $text, $font, $account->getPremDays() > 0 ? 'Premium Account': 'Free Account');

    imagefilledrectangle($img, 225, 40, 225, 130, $title); //seperator
    $posy = 50;
    
    if($db->hasColumn('players', 'skill_fist')) {// tfs 1.0+
        $skills_db = $db->query('SELECT `skill_fist`, `skill_club`, `skill_sword`, `skill_axe`, `skill_dist`, `skill_shielding`, `skill_fishing` FROM `players` WHERE `id` = ' . $player->getId())->fetch();
        
        $skill_ids = array(
            POT::SKILL_FIST => 'skill_fist',
            POT::SKILL_CLUB => 'skill_club',
            POT::SKILL_SWORD => 'skill_sword',
            POT::SKILL_AXE => 'skill_axe',
            POT::SKILL_DIST => 'skill_dist',
            POT::SKILL_SHIELD => 'skill_shielding',
            POT::SKILL_FISH => 'skill_fishing',
        );
        
        $skills = array();
        foreach($skill_ids as $skillid => $field_name) {
            $skills[] = array('skillid' => $skillid, 'value' => $skills_db[$field_name]);
        }
    }
    else {
        $skills = $db->query('SELECT ' . $db->fieldName('skillid') . ', ' . $db->fieldName('value') . ' FROM ' . $db->tableName('player_skills') . ' WHERE ' . $db->fieldName('player_id') . ' = ' . $player->getId() . ' LIMIT 7');
    }

    foreach($skills    as $skill)
    {
        imagettftext($img, $fontsize, 0, 235, $posy, $text, $font, getSkillName($skill['skillid']));
        imagettftext($img, $fontsize, 0, 360, $posy, $text, $font, $skill['value']);
        $posy = $posy + 13;
    }

    imagepng($img, SIGNATURES_CACHE . $player->getID() . '.png');
    imagedestroy($img);
?>
 
Standard question: what version of MyAAC, Webserver and PHP?

The lastest one MyAAC, Xampp,

Apache/2.4.37 (Win32) OpenSSL/1.1.1a PHP/7.3.1

edit:
I think it's some problem connecting to the cache folder or converting the access playerNAME to playerID, I already tried and trying a lot of changes but it doesn't work.
 
Last edited:
There is probably some Notice from PHP before image gets generated. Or an error.

Try to delete this line from the tibian file:
Code:
imagepng($img, SIGNATURES_CACHE . $player->getID() . '.png');

Then go to: http://localhost/?playerName.png

Replace playerName with your character name.
 
There is probably some Notice from PHP before image gets generated. Or an error.

Try to delete this line from the tibian file:
Code:
imagepng($img, SIGNATURES_CACHE . $player->getID() . '.png');

Then go to: http://localhost/?playerName.png

Replace playerName with your character name.

When I remove this line It just stop creating the file in cache/signatures, the error still the same

Maybe is there a way to make ”http://localhost/?playerName.png” connect directly to this archive png created in cache with playerID? It should work but i have no idea how to make it
 
Last edited:
Sorry I meant wrong line.

Remove this both (they are twice in file index)
Code:
readfile(SIGNATURES_CACHE . $player->getId().'.png');
 
Sorry I meant wrong line.

Remove this both (they are twice in file index)
Code:
readfile(SIGNATURES_CACHE . $player->getId().'.png');

Nothings happens :(

I had the same problem with headline.php and solved changing a part
", 'martel.ttf'," to "DIR . '/martel.ttf'"

I already tried a lot of combinations but none of them worked yet, do you know anything else that I can try? thanks
 
Is your server public available or it is localhost? Would you like to debug it through TeamViewer? I can then look into it closer. Contact me on priv if you wish such thing.
 
Back
Top