map.php
<?php
 
###########################################################################
##  Copyright (C) Wizardry and Steamworks 2016 - License: GNU GPLv3      ##
###########################################################################
## This is a script that reads the positions of characters from a mangos ##
## database and then, using a previously calibrated map image, plots the ##
## global position of those characters and returns the resulting image.  ##
###########################################################################

###########################################################################
##                            CONFIGURATION                              ##
###########################################################################

# The configuration file for this script containing the settings.
include_once("config.php");
 
###########################################################################
##                               INTERNALS                               ##
###########################################################################

class Point {
    public $x;
    public $y;
 
    function __construct($x, $y) {
        $this->x = $x;
        $this->y = $y;
    }
}
 
class Character {
    public $x;
    public $y;
    public $map;
    public $class;
    public $race;
 
    function __construct($x, $y, $map, $class, $race) {
        $this->x = $x;
        $this->y = $y;
        $this->map = $map;
        $this->class = $class;
        $this->race = $race;
    }
}
 
class GPS {
 
    private $gps = array();
 
    function __construct($gps) {
        $this->gps = $gps;
    }
 
    public function getPixel($x, $y, $map) {
        return new Point(
            $this->mapValueToRange(
                $y, 
                $this->gps[$map]['y']['wow'],
                $this->gps[$map]['Y']['wow'],
                $this->gps[$map]['X']['img'],
                $this->gps[$map]['x']['img']
            ),
            $this->mapValueToRange(
                $x, 
                $this->gps[$map]['x']['wow'],
                $this->gps[$map]['X']['wow'],
                $this->gps[$map]['Y']['img'],
                $this->gps[$map]['y']['img']
            )
        );
    }
 
    ###########################################################################
    ##  Copyright (C) Wizardry and Steamworks 2015 - License: GNU GPLv3      ##
    ###########################################################################
    private function mapValueToRange($value, $xMin, $xMax, $yMin, $yMax) {
        return $yMin + (
            (
                $yMax - $yMin
            ) 
            *
            (
                $value - $xMin
            )
            /
            (
                $xMax - $xMin
            )
        );
    }
}
 
###########################################################################
##  Copyright (C) Wizardry and Steamworks 2016 - License: GNU GPLv3      ##
###########################################################################
function wasResizePNG($img, $w, $h) {
    $width = imagesx($img);
    $height = imagesy($img);
    $new = imagecreatetruecolor($w, $h);
    imagecolortransparent(
        $new,
        imagecolorallocate(
            $new,
            0,
            0,
            0
        )
    );
    imagecopyresampled(
        $new,
        $img,
        0,
        0,
        0,
        0,
        $w,
        $h,
        $width, 
        $height
    );
    imagedestroy($img);
    return $new;
}
 
###########################################################################
##  Copyright (C) Wizardry and Steamworks 2016 - License: GNU GPLv3      ##
###########################################################################
function wasAddBorderPNG($img, $size, $color) {
    $width = imagesx($img);
    $height = imagesy($img);
 
    $img_adj_width = $width + (2 * $size);
    $img_adj_height = $height + (2 * $size);
 
    $new = imagecreatetruecolor(
        $img_adj_width,
        $img_adj_height
    );     
    imagecolortransparent(
        $new,
        imagecolorallocate(
            $new,
            0,
            0,
            0
        )
    );
 
    $color = imagecolorallocate(
        $new,
        $color['red'],
        $color['green'],
        $color['blue']
    );
    imagefilledrectangle(
        $new,
        0,
        0,
        $img_adj_width,
        $img_adj_height,
        $color
    );
    imagecopyresized(
        $new,
        $img,
        $size,
        $size,
        0,
        0,
        $width,
        $height,
        $width,
        $height
    );
    imagedestroy($img);
    return $new;
 
}
 
####
# I. Create a new World of Warcraft - Zero calibrated GPS map.
$gps = new GPS($CALIBRATED_MAP);
 
####
# II. Query all the online users, their 2D position and the map they are on.
$characters = array();
try {
    $db = new PDO('mysql:host='.$DATABASE_HOSTNAME.';dbname='.$DATABASE_NAME.';', $DATABASE_USERNAME, $DATABASE_PASSWORD);
    $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $q = $db->prepare("SELECT position_x,position_y,map,class,race FROM $DATABASE_NAME.characters WHERE online=1");
    $q->execute();
    foreach($q->fetchAll(PDO::FETCH_ASSOC) as $row) {
        array_push(
            $characters,
            new Character(
                $row['position_x'],
                $row['position_y'],
                $row['map'],
                $row['class'],
                $row['race']
            )
        );
    }
}
catch(PDOException $e) {
    print $e->getMessage();
    return;
}
 
####
# III. Output the Base64 encoded image for AJAX.
ob_start();
 
$img = imagecreatefrompng($IMAGE_DIRECTORY_PATH.'/'.$MAP_IMAGE);
imagealphablending($img, false);
imagesavealpha($img, true);
 
####
# IV. Plot all characters on the map.
array_walk($characters,
    function($character) use($gps, $img, $ALLEGIANCE, $ALLEGIANCE_COLOR, $ALLEGIANCE_BORDER_SIZE, $CLASS_ICON_SIZE, $IMAGE_DIRECTORY_PATH) { 
        $ico = wasAddBorderPNG(
            wasResizePNG(
                imagecreatefrompng(
                    $IMAGE_DIRECTORY_PATH.'/'.$character->class.'.png'
                ),
                $CLASS_ICON_SIZE['x'],
                $CLASS_ICON_SIZE['y']
            ),
            $ALLEGIANCE_BORDER_SIZE,
            $ALLEGIANCE_COLOR[
                array_shift(
                    array_keys(
                        array_filter(
                            $ALLEGIANCE,
                            function($a) use (&$character) {
                                return array_search($character->race, $a) !== FALSE;
                            }
                        )
                    )
                )
            ]
        );
        $pix = $gps->getPixel($character->x, $character->y, $character->map);
        imagecopymerge(
            $img,
            $ico,
            $pix->x - imagesx($ico)/2,
            $pix->y - imagesy($ico)/2,
            0,
            0,
            imagesx($img),
            imagesy($img),
            100
        );
        imagedestroy($ico);
    }
);
 
imagepng($img);
$png = ob_get_contents();
imagedestroy($img);
ob_end_clean();
 
####
# V. Dump the Base64 encoded map.
echo base64_encode($png);
 
?>

mangos/track_players_on_map/map.php.txt ยท Last modified: 2022/04/19 08:28 by 127.0.0.1

Access website using Tor Access website using i2p Wizardry and Steamworks PGP Key


For the contact, copyright, license, warranty and privacy terms for the usage of this website please see the contact, license, privacy, copyright.