├── .htaccess ├── www ├── img │ ├── bc.gif │ ├── cata.png │ ├── mop.png │ ├── wrath.png │ ├── mapcraft.gif │ ├── topnav_bg.gif │ ├── subnav_btn.gif │ └── subnav_btn2.gif ├── favicon.ico ├── purple-stripes.png ├── samplePanorama.png ├── .htaccess ├── style.css ├── map.js ├── pano.js ├── areas.js ├── index.php ├── areas.php ├── pano.php └── areadata.js ├── logo ├── wow_base.psp ├── wow_comp.psp └── wow_letter.psp ├── .gitignore ├── list.php ├── install.sh ├── notes.txt ├── ssl.conf ├── site.conf ├── azeroth.sh ├── extract.sh ├── LABELS.md ├── dbc └── parse.php ├── README.md └── wmo └── parse.php /.htaccess: -------------------------------------------------------------------------------- 1 | Options +Indexes 2 | Deny from All 3 | -------------------------------------------------------------------------------- /www/img/bc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/World-of-MapCraft/HEAD/www/img/bc.gif -------------------------------------------------------------------------------- /www/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/World-of-MapCraft/HEAD/www/favicon.ico -------------------------------------------------------------------------------- /www/img/cata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/World-of-MapCraft/HEAD/www/img/cata.png -------------------------------------------------------------------------------- /www/img/mop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/World-of-MapCraft/HEAD/www/img/mop.png -------------------------------------------------------------------------------- /logo/wow_base.psp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/World-of-MapCraft/HEAD/logo/wow_base.psp -------------------------------------------------------------------------------- /logo/wow_comp.psp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/World-of-MapCraft/HEAD/logo/wow_comp.psp -------------------------------------------------------------------------------- /logo/wow_letter.psp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/World-of-MapCraft/HEAD/logo/wow_letter.psp -------------------------------------------------------------------------------- /www/img/wrath.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/World-of-MapCraft/HEAD/www/img/wrath.png -------------------------------------------------------------------------------- /www/img/mapcraft.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/World-of-MapCraft/HEAD/www/img/mapcraft.gif -------------------------------------------------------------------------------- /www/img/topnav_bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/World-of-MapCraft/HEAD/www/img/topnav_bg.gif -------------------------------------------------------------------------------- /www/img/subnav_btn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/World-of-MapCraft/HEAD/www/img/subnav_btn.gif -------------------------------------------------------------------------------- /www/img/subnav_btn2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/World-of-MapCraft/HEAD/www/img/subnav_btn2.gif -------------------------------------------------------------------------------- /www/purple-stripes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/World-of-MapCraft/HEAD/www/purple-stripes.png -------------------------------------------------------------------------------- /www/samplePanorama.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/World-of-MapCraft/HEAD/www/samplePanorama.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | mpqs 2 | built 3 | flats 4 | maps 5 | out_fixed 6 | pngs 7 | pngs_fixed 8 | *.dbc 9 | *.db2 10 | lists 11 | crushed 12 | mop_built 13 | mop_maps 14 | mop_mpqs 15 | mop_out 16 | mop_pngs 17 | mop_crushed 18 | mop_flats 19 | -------------------------------------------------------------------------------- /www/.htaccess: -------------------------------------------------------------------------------- 1 | RewriteEngine on 2 | 3 | RewriteCond %{HTTP_HOST} ^www\.worldofmapcraft\.com$ [NC] 4 | RewriteRule ^/?(.*)$ https://worldofmapcraft.com/$1 [L,R=permanent] 5 | 6 | RewriteCond %{REQUEST_URI} !^/img/ 7 | RewriteRule ^(.+)/ /index.php?m=$1 [L,B,QSA] 8 | 9 | -------------------------------------------------------------------------------- /list.php: -------------------------------------------------------------------------------- 1 | 2 | ServerName worldofmapcraft.com 3 | ServerAlias www.worldofmapcraft.com 4 | DocumentRoot /var/www/html/worldofmapcraft.com/www 5 | 6 | SSLEngine on 7 | SSLCertificateFile /etc/letsencrypt/live/worldofmapcraft.com/cert.pem 8 | SSLCertificateChainFile /etc/letsencrypt/live/worldofmapcraft.com/chain.pem 9 | SSLCertificateKeyFile /etc/letsencrypt/live/worldofmapcraft.com/privkey.pem 10 | 11 | Include /etc/letsencrypt/options-ssl-apache.conf 12 | 13 | -------------------------------------------------------------------------------- /site.conf: -------------------------------------------------------------------------------- 1 | 2 | php_admin_flag engine on 3 | php_admin_flag safe_mode off 4 | php_flag short_open_tag on 5 | Options -Includes -ExecCGI 6 | AllowOverride All 7 | 8 | 9 | 10 | DocumentRoot /var/www/html/worldofmapcraft.com/www 11 | ServerName worldofmapcraft.com 12 | ServerAlias www.worldofmapcraft.com 13 | 14 | Redirect permanent / https://worldofmapcraft.com/ 15 | 16 | 17 | Include /var/www/html/worldofmapcraft.com/ssl.conf 18 | -------------------------------------------------------------------------------- /azeroth.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | /root/git-projects/MPQExtractor/build/bin/MPQExtractor \ 4 | -e "World\maps\azeroth\azeroth_*" -f -c -p \ 5 | mop_mpqs/expansion1.MPQ \ 6 | mop_mpqs/expansion2.MPQ \ 7 | mop_mpqs/expansion3.MPQ \ 8 | mop_mpqs/expansion4.MPQ \ 9 | mop_mpqs/wow-update-base-15508.MPQ \ 10 | mop_mpqs/wow-update-base-15544.MPQ \ 11 | mop_mpqs/wow-update-base-15589.MPQ \ 12 | mop_mpqs/wow-update-base-15640.MPQ \ 13 | mop_mpqs/wow-update-base-15650.MPQ \ 14 | mop_mpqs/wow-update-base-15657.MPQ \ 15 | mop_mpqs/wow-update-base-15662.MPQ \ 16 | mop_mpqs/wow-update-base-15668.MPQ \ 17 | mop_mpqs/wow-update-base-15677.MPQ \ 18 | mop_mpqs/wow-update-base-15689.MPQ \ 19 | mop_mpqs/wow-update-base-15699.MPQ \ 20 | mop_mpqs/wow-update-base-15726.MPQ \ 21 | mop_mpqs/wow-update-base-15739.MPQ \ 22 | mop_mpqs/wow-update-base-15752.MPQ \ 23 | mop_mpqs/wow-update-base-15762.MPQ \ 24 | mop_mpqs/wow-update-base-15781.MPQ \ 25 | -o mop_out mop_mpqs/world.MPQ 26 | 27 | rm -f mop_out/world/maps/azeroth/azeroth_*_obj0.adt 28 | rm -f mop_out/world/maps/azeroth/azeroth_*_obj1.adt 29 | rm -f mop_out/world/maps/azeroth/azeroth_*_tex0.adt 30 | rm -f mop_out/world/maps/azeroth/azeroth_*_tex1.adt 31 | -------------------------------------------------------------------------------- /extract.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | /root/git-projects/MPQExtractor/build/bin/MPQExtractor \ 4 | -e "World\Minimaps\*" -f -c -p \ 5 | mop_mpqs/expansion1.MPQ \ 6 | mop_mpqs/expansion2.MPQ \ 7 | mop_mpqs/expansion3.MPQ \ 8 | mop_mpqs/expansion4.MPQ \ 9 | mop_mpqs/wow-update-base-15508.MPQ \ 10 | mop_mpqs/wow-update-base-15544.MPQ \ 11 | mop_mpqs/wow-update-base-15589.MPQ \ 12 | mop_mpqs/wow-update-base-15640.MPQ \ 13 | mop_mpqs/wow-update-base-15650.MPQ \ 14 | mop_mpqs/wow-update-base-15657.MPQ \ 15 | mop_mpqs/wow-update-base-15662.MPQ \ 16 | mop_mpqs/wow-update-base-15668.MPQ \ 17 | mop_mpqs/wow-update-base-15677.MPQ \ 18 | mop_mpqs/wow-update-base-15689.MPQ \ 19 | mop_mpqs/wow-update-base-15699.MPQ \ 20 | mop_mpqs/wow-update-base-15726.MPQ \ 21 | mop_mpqs/wow-update-base-15739.MPQ \ 22 | mop_mpqs/wow-update-base-15752.MPQ \ 23 | mop_mpqs/wow-update-base-15762.MPQ \ 24 | mop_mpqs/wow-update-base-15781.MPQ \ 25 | -o mop_out mop_mpqs/texture.MPQ 26 | 27 | /root/git-projects/MPQExtractor/build/bin/MPQExtractor \ 28 | -e "World\WMO\*" -f -c -p \ 29 | mop_mpqs/expansion1.MPQ \ 30 | mop_mpqs/expansion2.MPQ \ 31 | mop_mpqs/expansion3.MPQ \ 32 | mop_mpqs/expansion4.MPQ \ 33 | mop_mpqs/wow-update-base-15508.MPQ \ 34 | mop_mpqs/wow-update-base-15544.MPQ \ 35 | mop_mpqs/wow-update-base-15589.MPQ \ 36 | mop_mpqs/wow-update-base-15640.MPQ \ 37 | mop_mpqs/wow-update-base-15650.MPQ \ 38 | mop_mpqs/wow-update-base-15657.MPQ \ 39 | mop_mpqs/wow-update-base-15662.MPQ \ 40 | mop_mpqs/wow-update-base-15668.MPQ \ 41 | mop_mpqs/wow-update-base-15677.MPQ \ 42 | mop_mpqs/wow-update-base-15689.MPQ \ 43 | mop_mpqs/wow-update-base-15699.MPQ \ 44 | mop_mpqs/wow-update-base-15726.MPQ \ 45 | mop_mpqs/wow-update-base-15739.MPQ \ 46 | mop_mpqs/wow-update-base-15752.MPQ \ 47 | mop_mpqs/wow-update-base-15762.MPQ \ 48 | mop_mpqs/wow-update-base-15781.MPQ \ 49 | -o mop_out mop_mpqs/world.MPQ 50 | -------------------------------------------------------------------------------- /LABELS.md: -------------------------------------------------------------------------------- 1 | # Adding labels to the map 2 | 3 | I'm trying to add automated labels to the maps, so they can always be updated an accurate. 4 | 5 | * `AreaTable.dbc` contains a list of areas with labels 6 | * Each area has a pointer to parent the area (where there is one) 7 | * These contain no location data, however 8 | 9 | * World `wdt` files contain 256 (16x16) chunks per world tile 10 | * Each chunk contains an areaID 11 | * Since `azeroth_11_22.adt` matches `azeroth/map_11_22.blp`, I can match chunks to map tiles 12 | 13 | There are two steps to this process: 14 | 15 | cd build/ 16 | php areas1.php > zones.txt 17 | php areas2.php > ../www/areadata.js 18 | 19 | The first script partses the `.adt` files and outputs a map of each numbered zone and its bounds. 20 | 21 | The second script reads `AreaTable.dbc`, recursively finds children, then outputs a JavaScript file mapping areaIDs to pixel bounds on the master map. 22 | 23 | A custom map driver then loads these shapes: 24 | 25 | http://worldofmapcraft.com/areas.php 26 | 27 | The current test is loading Stormwind City (#1519), Elwynn Forest (#12) and Tirisfal Glades (#85). 28 | 29 | An issue can clearly be seen with Elwynn - the mountains north of Stormwind are tagged as being in the forest. 30 | While they technically are part of Elwynn, this is pretty useless for labelling; a label in the middle 31 | of the box will be in the 'wrong' place. This could be combatted by only including child areas (for areas 32 | with children) as the bounding box, and just ignoring chunks tagged with the Elwynn area itself. It's not clear 33 | if this approach would work everywhere. 34 | 35 | Another issue can be seen with Stormwind - lots of the ocean is tagged as being part of Stormwing Harbour 36 | (a child area of Stormwind City), so the box extends far out to sea. A centered label would be over the harbour 37 | area, which while not ideal, might be fine. 38 | 39 | With these issues, it may be better to just manually place labels. Urgh! 40 | -------------------------------------------------------------------------------- /www/style.css: -------------------------------------------------------------------------------- 1 | div.topnav { 2 | background-color: #222; 3 | background-image: url(/img/topnav_bg.gif); 4 | background-repeat: repeat-x; 5 | padding: 0 8px; 6 | height: 35px; 7 | font-family: Arial, Helvetica, sans-serif; 8 | font-size: 14px; 9 | } 10 | div.topnav img { 11 | border: 0; 12 | float: left; 13 | } 14 | 15 | div.source { 16 | float: right; 17 | padding: 9px 5px; 18 | color: white; 19 | display: block; 20 | } 21 | div.source a { 22 | color: #aaa; 23 | text-decoration: none; 24 | } 25 | 26 | /* =========================================================== */ 27 | 28 | #nav { 29 | float: left; 30 | padding: 0; 31 | margin: 0 0 0 20px; 32 | line-height: 100%; 33 | } 34 | #nav li { 35 | margin: 0 10px; 36 | padding: 0 0 0 0; 37 | float: left; 38 | position: relative; 39 | list-style: none; 40 | } 41 | 42 | #nav li.tophassub { 43 | padding-right: 14px; 44 | background-image: url(/img/subnav_btn.gif); 45 | background-position: center right; 46 | background-repeat: no-repeat; 47 | height: 35px; 48 | } 49 | 50 | #nav li.subhassub { 51 | background-image: url(/img/subnav_btn2.gif); 52 | background-position: 170px center; 53 | background-repeat: no-repeat; 54 | } 55 | 56 | /* top level */ 57 | #nav a { 58 | color: #fff; 59 | text-decoration: none; 60 | display: block; 61 | padding: 9px 0 0 0; 62 | margin: 0; 63 | text-shadow: 0 1px 1px rgba(0, 0, 0, .3); 64 | height: 35px; 65 | } 66 | #nav a.current { 67 | color: #A4D627 !important; 68 | } 69 | #nav li:hover > a { 70 | color: #CAE77D; 71 | } 72 | #nav a.pending, 73 | #nav li:hover > a.pending { 74 | color: #666 !important; 75 | } 76 | 77 | 78 | 79 | /* sub levels */ 80 | #nav ul li:hover a, #nav li:hover li a { 81 | background: none; 82 | border: none; 83 | color: #fff; 84 | } 85 | #nav ul a:hover { 86 | color: #CAE77D !important; 87 | text-shadow: 0 1px 1px rgba(0, 0, 0, .1); 88 | } 89 | 90 | /* level 2 list */ 91 | #nav ul { 92 | z-order: 100; 93 | display: none; 94 | margin: 0; 95 | padding: 0; 96 | width: 185px; 97 | position: absolute; 98 | top: 34px; 99 | left: 0; 100 | background: #333; 101 | border: 1px solid #111; 102 | } 103 | 104 | /* dropdown */ 105 | #nav li:hover > ul { 106 | display: block; 107 | } 108 | #nav ul li { 109 | float: none; 110 | margin: 0; 111 | padding: 0; 112 | border-top: 1px solid #252525; 113 | border-bottom: 1px solid #444; 114 | } 115 | #nav ul a { 116 | margin: 0; 117 | padding: 6px 20px 6px 20px; 118 | font-weight: normal; 119 | background: #333; 120 | height: auto; 121 | } 122 | #nav ul a:hover { 123 | background: #222; 124 | } 125 | 126 | /* level 3+ list */ 127 | #nav ul ul { 128 | z-order: 300; 129 | left: 185px; 130 | top: 5px; 131 | } 132 | 133 | /* clearfix */ 134 | #nav:after { 135 | content: "."; 136 | display: block; 137 | clear: both; 138 | visibility: hidden; 139 | line-height: 0; 140 | height: 0; 141 | } 142 | #nav { 143 | display: inline-block; 144 | } 145 | html[xmlns] #nav { 146 | display: block; 147 | } 148 | * html #nav { 149 | height: 1%; 150 | } 151 | 152 | -------------------------------------------------------------------------------- /dbc/parse.php: -------------------------------------------------------------------------------- 1 | $v){ 11 | $areas[$k]['children'] = get_children($children, $k); 12 | } 13 | 14 | function get_children(&$children, $k){ 15 | if (!$children[$k]) return array(); 16 | $out = $children[$k]; 17 | foreach ($children[$k] as $k2 => $v){ 18 | $m = get_children($children, $k2); 19 | foreach ($m as $i => $j) $out[$i] = 1; 20 | } 21 | return $out; 22 | } 23 | 24 | 25 | print_r($areas[1519]); 26 | exit; 27 | 28 | foreach ($areas as $row){ 29 | if ($row[1] == 1519){ 30 | echo "$row[1] : $row[12] ($row[3])\n"; 31 | } 32 | if ($row[3] == 1519){ 33 | echo "$row[1] : $row[12]\n"; 34 | } 35 | } 36 | exit; 37 | 38 | #$wm_areas = parse_dbc('WorldMapArea.bdc', array(4), 1); 39 | 40 | $x = parse_dbc('WorldMapOverlay.dbc', array(9)); 41 | 42 | foreach (array_slice($x, 0, 2) as $row){ 43 | 44 | $row['area'] = $areas[$row[3]]; 45 | #$row['wm_area'] = $wm_areas[$row[2]]; 46 | print_r($row); 47 | } 48 | 49 | #print_r(array_slice($x, 0, 10)); 50 | exit; 51 | 52 | #$w = parse_dbc('WMOAreaTable.dbc'); 53 | #print_r($w); 54 | #foreach ($w as $row) if ($row[1] == 617) print_r($row); 55 | #exit; 56 | 57 | #$map = parse_dbc('Map.dbc', array(2), 1); 58 | #print_r($map); 59 | #print_r($map[617]); 60 | #print_r($map[571]); 61 | #exit; 62 | 63 | $areas = parse_dbc('AreaTable.dbc', array(12), 1); 64 | print_r($areas); 65 | exit; 66 | 67 | foreach ($areas as $row){ 68 | if (preg_match('!^Dalaran!', $row[12])) print_r($row); 69 | } 70 | #print_r($areas); 71 | exit; 72 | 73 | $aa = parse_dbc('AreaAssignment.dbc', array(), 1); 74 | 75 | $dm = parse_dbc('DungeonMap.dbc', array(), 1); 76 | $dmc = parse_dbc('DungeonMapChunk.dbc', array(), 1); 77 | 78 | #print_r($aa); 79 | 80 | #foreach ($aa as $row){ 81 | # if ($row[3] == 2437) print_r($row); 82 | #} 83 | 84 | #foreach ($dm as $row){ 85 | # if ($row[2] == 389) print_r($row); 86 | #} 87 | 88 | #foreach ($dmc as $row){ 89 | # if ($row[2] == 389) print_r($row); 90 | #} 91 | 92 | 93 | 94 | print_r($map[389]); 95 | #print_r($areas[2437]); 96 | 97 | 98 | 99 | 100 | 101 | function parse_dbc($file, $string_fields=array(), $id_idx=1){ 102 | 103 | $fh = fopen($file, 'r'); 104 | $sig = fread($fh, 4); 105 | 106 | $records = read_int($fh); 107 | $fields = read_int($fh); 108 | $record_size = read_int($fh); 109 | $strings_size = read_int($fh); 110 | 111 | if ($fields * 4 != $record_size){ 112 | die("unexpected field size! ($fields fields = $record_size bytes)"); 113 | } 114 | 115 | $rows = array(); 116 | for ($i=0; $i<$records; $i++){ 117 | $row = array(); 118 | for ($j=0; $j<$fields; $j++){ 119 | $row[$j+1] = read_int($fh); 120 | } 121 | if ($id_idx){ 122 | $rows[$row[$id_idx]] = $row; 123 | }else{ 124 | $rows[] = $row; 125 | } 126 | } 127 | 128 | $string_data = fread($fh, $strings_size); 129 | 130 | foreach ($rows as &$row){ 131 | foreach ($string_fields as $f){ 132 | $p = $row[$f]; 133 | if ($p >= $strings_size){ 134 | $row[$f] = "LOC? ($p)"; 135 | }else{ 136 | $idx = strpos($string_data, "\0", $p); 137 | if ($idx !== false){ 138 | $row[$f] = substr($string_data, $p, $idx-$p); 139 | }else{ 140 | $row[$f] = "OVER ($p)"; 141 | } 142 | } 143 | } 144 | } 145 | 146 | return $rows; 147 | } 148 | 149 | 150 | 151 | 152 | function read_int($fh){ 153 | $data = fread($fh, 4); 154 | list($junk, $n) = unpack('V', $data); 155 | return $n; 156 | } 157 | -------------------------------------------------------------------------------- /www/map.js: -------------------------------------------------------------------------------- 1 | var map_config = { 2 | fileExt : 'png', 3 | tileSize : 256, 4 | defaultZoom : 0, 5 | cacheMinutes : 0, 6 | debug : false 7 | }; 8 | 9 | 10 | // 11 | // a very simple projection 12 | // 13 | 14 | function WoWMapProjection(){} 15 | 16 | WoWMapProjection.prototype.fromLatLngToPoint = function(latLng){ 17 | var x = latLng.lng() * map_config.tileSize; 18 | var y = latLng.lat() * map_config.tileSize; 19 | return new google.maps.Point(x, y); 20 | }; 21 | 22 | WoWMapProjection.prototype.fromPointToLatLng = function(point){ 23 | var lng = point.x * (1.0 / map_config.tileSize); 24 | var lat = point.y * (1.0 / map_config.tileSize); 25 | return new google.maps.LatLng(lat, lng); 26 | }; 27 | 28 | 29 | function LatLngToPixels(latLng){ 30 | 31 | var pnt = WoWMapProjection.prototype.fromLatLngToPoint(latLng); 32 | return [pnt.x * 8, pnt.y * 8]; 33 | } 34 | 35 | function PixelsToLatLng(pxs){ 36 | 37 | var pnt = {x: pxs[0] / 8, y: pxs[1] / 8}; 38 | return WoWMapProjection.prototype.fromPointToLatLng(pnt); 39 | } 40 | 41 | 42 | 43 | var map; 44 | var WoWMapOptions; 45 | 46 | function initialize() { 47 | 48 | // 49 | // the class for our map layer 50 | // 51 | 52 | var num_layers = 0; 53 | for (var i in tiles_config.layers) num_layers++; 54 | 55 | WoWMapOptions = { 56 | 57 | getTileUrl: function(tile, zoom) { 58 | 59 | //console.log(tile.x, tile.y); 60 | 61 | if (tile.x < 0 || tile.y < 0) return null; 62 | 63 | var z = 1 + ((num_layers-2) - zoom); 64 | 65 | if (tiles_config.layers[z][0] < tile.x) return null; 66 | if (tiles_config.layers[z][1] < tile.y) return null; 67 | 68 | var tx = ""+tile.x; 69 | var ty = ""+tile.y; 70 | while (tx.length < 2) tx = "0"+tx; 71 | while (ty.length < 2) ty = "0"+ty; 72 | 73 | var url = tiles_config.stem+'tile_z'+z+'_'+tx+'_'+ty+'.png'; 74 | //console.log(tile, url); 75 | 76 | return url; 77 | }, 78 | tileSize: new google.maps.Size(map_config.tileSize, map_config.tileSize), 79 | maxZoom: num_layers-1, 80 | minZoom: 0, 81 | isPng: false 82 | }; 83 | 84 | var WoWMapType = new google.maps.ImageMapType(WoWMapOptions); 85 | WoWMapType.name = "WoW Map"; 86 | WoWMapType.alt = "World of Warcraft Map"; 87 | WoWMapType.projection = new WoWMapProjection(); 88 | 89 | 90 | var mapOptions = { 91 | backgroundColor: tiles_config.bgcolor, 92 | zoom: map_config.defaultZoom, 93 | center: new google.maps.LatLng(tiles_config.center[0], tiles_config.center[1]), 94 | 95 | zoomControl: true, 96 | zoomControlOptions: { style: google.maps.ZoomControlStyle.LARGE }, 97 | panControl: false, 98 | rotateControl: false, 99 | overviewMapControl: false, 100 | scaleControl: false, 101 | mapTypeControl: false, 102 | streetViewControl: false, 103 | 104 | mapTypeId: 'WoWmap' 105 | }; 106 | map = new google.maps.Map(document.getElementById("map"), mapOptions); 107 | 108 | // Now attach the coordinate map type to the map's registry 109 | map.mapTypes.set('WoWmap', WoWMapType); 110 | 111 | // We can now set the map to use the 'coordinate' map type 112 | map.setMapTypeId('WoWmap'); 113 | 114 | 115 | 116 | // deal with hash stuff 117 | hash_init(); 118 | google.maps.event.addListener(map, 'dragend', hash_update); 119 | google.maps.event.addListener(map, 'zoom_changed', hash_update); 120 | } 121 | 122 | function hash_init(){ 123 | if (window.location.hash.split("/").length > 1){ 124 | hash_goto(); 125 | hash_update(); 126 | } 127 | } 128 | 129 | function hash_update(){ 130 | var pos = LatLngToPixels(map.getCenter()); 131 | var zoom = map.getZoom(); 132 | hash_set(pos[0], pos[1], zoom); 133 | } 134 | 135 | function hash_set(x, y, zoom){ 136 | window.location.replace("#/" + Math.floor(x) + "/" + Math.floor(y) + "/" + zoom + "/"); 137 | } 138 | 139 | function hash_goto(){ 140 | 141 | var coords = window.location.hash.split("/"); 142 | var latlng = PixelsToLatLng([parseInt(coords[1]), parseInt(coords[2])]); 143 | 144 | var zoom = parseInt(coords[3]); 145 | if (zoom < 0 || zoom > WoWMapOptions.maxZoom){ 146 | zoom = map_config.defaultZoom; 147 | } 148 | 149 | map.setCenter(latlng); 150 | map.setZoom(zoom); 151 | } 152 | 153 | 154 | 155 | $(document).ready(function(){ 156 | 157 | $("ul#nav > li > ul").parent().addClass("tophassub"); 158 | $("ul#nav ul ul").parent().addClass("subhassub"); 159 | $("li a.current").parents("li").children('a').addClass("current"); 160 | }); 161 | 162 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | World-of-MapCraft - World of Warcraft Slippy Maps 2 | ================================================= 3 | 4 | To see the maps in action: http://worldofmapcraft.com/ 5 | 6 | For an explanation of how it all works: http://www.iamcal.com/world-of-mapcraft/ 7 | 8 | 9 | ## Generating the map tiles 10 | 11 | This code will help you to generate your own set of map tiles. 12 | It wont work immediately out of the box - there's some fiddling involved. 13 | There are many more maps included in WoW than are used on the website - try extracting 14 | some different ones! 15 | 16 | 17 | ### Preparation 18 | 19 | * Make sure you have at least 10 GB of space! 20 | * Install ImageMagick 21 | * Install MPQExtractor & BLPConverter 22 | * Both of these tools require cmake to build 23 | * Create some folders: 24 | * mpqs - base MPQ files will go here 25 | * blps - extracedt BLP files will go here 26 | * pngs - PNGs converted from BLPs will go here 27 | * maps - Preview maps will go here 28 | * built - Final built tilesets will go here 29 | * It is very helpful for these folders to be accessible in a browser. 30 | * Modify build/config.php with the paths and URLs to these folders 31 | * Copy MPQ files from your WoW install, specifically: 32 | * art.MPQ 33 | * world.MPQ 34 | * wow-update-nnnnn.MPQ (multiple files) 35 | * wow-update-base-nnnnn.MPQ (multiple files) 36 | * You'll find them all inside the Data subfolder of your WoW installation 37 | 38 | 39 | ### Generation 40 | 41 | * Extract the BLP and WMO files from the MPQs: 42 | * `./extract.sh` is a good starting point 43 | * This will take a few minutes! 44 | 45 | * Run build/0_rename.php to fix path casing. 46 | * You don't need to do this if you have the `-c` option in MPQExtractor 47 | 48 | * Run build/1_convert.php to convert all of the BLP files to PNGs 49 | * This takes a while! 50 | * You should now have lots of sub-folders in the pngs folder 51 | 52 | * Run build/2_combine.php to make HTML previews or all the maps 53 | * You can now browse the maps subfolder and view everything you extracted 54 | * The files ending --16 use lower-resolution files so are good for quick previews 55 | 56 | * Once you know the tiles you want, modify the code at the top of build/3_build.php 57 | * The defaults are set for patch 4.3, extracting a few different maps - you may want more or less 58 | * They include combining multiple maps and patching over unused parts of tiles 59 | * This script builds the most-zoomed level of tiles for the final maps 60 | * The background colors specified here need to match `build/colors.php` 61 | 62 | * Run build/4_recombine.php to preview your creaed tilesets 63 | * The $size setting at the top lets you change the preview output size 64 | * Choose 16 or smaller to load the quick preview images 65 | 66 | * Run build/5_resize.php to build the other zoom levels 67 | * This will take a long time for big maps 68 | 69 | * You should now be able to view your slippy maps! 70 | * Modify www/index.php to point to the tiles 71 | * Also add the zoom levels & dimensions here 72 | 73 | * If you want to put the tiles on S3, use build/6_sync.php 74 | 75 | * To compress the PNGs for faster serving, use build/7_crush.php 76 | 77 | * If you want to make WMO maps, you'll need some extra tools: 78 | * `build/wmo_build.php` to assemble a flat image from a WMO group 79 | * `build/wmo_assemble.php` to assemble multiple flats into a tileset 80 | * From there, you can use build/5_resize.php to build the other zoom levels 81 | 82 | 83 | ## Changes in MoP 84 | 85 | * `art.MPQ` has been renamed `textures.MPQ` 86 | * Expansion minimap textures have been moved to `exspansionX.MPQ` files 87 | * `world2.MPQ` is gone, with contents moved into a bunch of new MPQs 88 | * All patch MPQs have no prefix (this changed in cata in March 2012) 89 | 90 | To find new WMOs to build and preview for MoP, I used the following commands: 91 | 92 | find dungeon | grep pa_ | grep .blp | perl -pi -e's!_\d\d\d_\d\d_\d\d.blp!!' | \ 93 | sort | uniq | perl -pi -e's/(.*)\/(.*?)$/$1!!$2/' >> wmos.txt 94 | find pandaria | grep .blp | perl -pi -e's!_\d\d\d_\d\d_\d\d.blp!!' | \ 95 | sort | uniq | perl -pi -e's/(.*)\/(.*?)$/$1!!$2/' >> wmos.txt 96 | 97 | This found all WMO groups under either the `pandaria` folder, or inside the 98 | dungeons folder with a prefix of `pa_`. I then used this list to make a bunch 99 | of calls to `build_wmo_map()` in `wmo_build.php`. 100 | 101 | 102 | ## Installing the web site 103 | 104 | ./install.php https://github.com/iamcal/World-of-MapCraft 105 | -------------------------------------------------------------------------------- /wmo/parse.php: -------------------------------------------------------------------------------- 1 | $x2,$y2"; 90 | } 91 | 92 | function extract_group_id($name){ 93 | 94 | $fh = fopen($name, 'r'); 95 | fseek($fh, 20 + 0x38); 96 | $id = read_int($fh); 97 | fclose($fh); 98 | 99 | return $id; 100 | } 101 | 102 | function extract_root_id($name){ 103 | 104 | $fh = fopen($name, 'r'); 105 | fseek($fh, 20 + 0x20); 106 | $id = read_int($fh); 107 | fclose($fh); 108 | 109 | return $id; 110 | } 111 | 112 | 113 | function chunk_map($fh, $seek=1){ 114 | 115 | if ($seek){ 116 | $offset = 0; 117 | fseek($fh, 0); 118 | }else{ 119 | $offset = ftell($fh); 120 | } 121 | 122 | while (!feof($fh)){ 123 | 124 | $type = fread($fh, 4); 125 | if (strlen($type) < 4) return; 126 | $type = strrev($type); 127 | 128 | $size = read_int($fh); 129 | fseek($fh, $size, SEEK_CUR); 130 | 131 | echo "$type: $size (@$offset)\n"; 132 | 133 | $offset += 8 + $size; 134 | } 135 | } 136 | 137 | function seek_to_chunk($fh, $name){ 138 | 139 | fseek($fh, 0); 140 | while (!feof($fh)){ 141 | 142 | $type = fread($fh, 4); 143 | if (strlen($type) < 4) break; 144 | $type = strrev($type); 145 | 146 | $size = read_int($fh); 147 | if ($type == $name) return true; 148 | 149 | fseek($fh, $size, SEEK_CUR); 150 | } 151 | 152 | return false; 153 | } 154 | 155 | 156 | 157 | function read_int($fh){ 158 | $data = fread($fh, 4); 159 | list($junk, $n) = unpack('V', $data); 160 | return $n; 161 | } 162 | 163 | 164 | function extract_mogi($filename){ 165 | 166 | $fh = fopen($filename, 'r'); 167 | 168 | seek_to_chunk($fh, 'MOHD'); 169 | fseek($fh, 4, SEEK_CUR); 170 | $groups = read_int($fh); 171 | 172 | seek_to_chunk($fh, 'MOHD'); 173 | fseek($fh, 0x24, SEEK_CUR); 174 | $floats = fread($fh, 24); 175 | $box = unpack('f6', $floats); 176 | echo "root\t\t: ".format_box($box)."\n"; 177 | 178 | seek_to_chunk($fh, 'MOGI'); 179 | for ($i=0; $i<$groups; $i++){ 180 | 181 | $flags = read_int($fh); 182 | $floats = fread($fh, 24); 183 | $box = unpack('f6', $floats); 184 | $name = read_int($fh); 185 | 186 | 187 | 188 | echo "group $i \t: ".format_box($box)."\n"; 189 | #print_r($box); 190 | } 191 | 192 | #echo "found $groups groups\n"; 193 | #exit; 194 | } 195 | 196 | 197 | function format_box($box){ 198 | $x1 = str_pad(round($box[1]), 4, ' ', STR_PAD_LEFT); 199 | $y1 = str_pad(round($box[2]), 4, ' ', STR_PAD_LEFT); 200 | $z1 = str_pad(round($box[3]), 4, ' ', STR_PAD_LEFT); 201 | $x2 = str_pad(round($box[4]), 4, ' ', STR_PAD_LEFT); 202 | $y2 = str_pad(round($box[5]), 4, ' ', STR_PAD_LEFT); 203 | $z2 = str_pad(round($box[6]), 4, ' ', STR_PAD_LEFT); 204 | 205 | 206 | return round($box[1]).','.round(0-$box[2]); 207 | 208 | $from = round(27+32+0-$box[6]).','.round(103+$box[1]); 209 | $to = round(27+32+0-$box[3]).','.round(103+$box[4]); 210 | return "$from - $to"; 211 | 212 | return "($x1, $y1, $z1) - ($x2, $y2, $z2)"; 213 | } 214 | -------------------------------------------------------------------------------- /www/pano.js: -------------------------------------------------------------------------------- 1 | var sv_mode = false; 2 | var map_config = { 3 | fileExt : 'png', 4 | tileSize : 256, 5 | defaultZoom : 0, 6 | cacheMinutes : 0, 7 | debug : false 8 | }; 9 | 10 | 11 | // 12 | // a very simple projection 13 | // 14 | 15 | function WoWMapProjection(){} 16 | 17 | WoWMapProjection.prototype.fromLatLngToPoint = function(latLng){ 18 | var x = latLng.lng() * map_config.tileSize; 19 | var y = latLng.lat() * map_config.tileSize; 20 | return new google.maps.Point(x, y); 21 | }; 22 | 23 | WoWMapProjection.prototype.fromPointToLatLng = function(point){ 24 | var lng = point.x * (1.0 / map_config.tileSize); 25 | var lat = point.y * (1.0 / map_config.tileSize); 26 | return new google.maps.LatLng(lat, lng); 27 | }; 28 | 29 | 30 | function LatLngToPixels(latLng){ 31 | 32 | var pnt = WoWMapProjection.prototype.fromLatLngToPoint(latLng); 33 | return [pnt.x * 8, pnt.y * 8]; 34 | } 35 | 36 | function PixelsToLatLng(pxs){ 37 | 38 | var pnt = {x: pxs[0] / 8, y: pxs[1] / 8}; 39 | return WoWMapProjection.prototype.fromPointToLatLng(pnt); 40 | } 41 | 42 | 43 | 44 | var map; 45 | var WoWMapOptions; 46 | 47 | function initialize() { 48 | 49 | // 50 | // the class for our map layer 51 | // 52 | 53 | var num_layers = 0; 54 | for (var i in tiles_config.layers) num_layers++; 55 | 56 | WoWMapOptions = { 57 | 58 | getTileUrl: function(tile, zoom) { 59 | 60 | //console.log(tile.x, tile.y); 61 | 62 | if (tile.x < 0 || tile.y < 0) return null; 63 | 64 | var z = 1 + ((num_layers-2) - zoom); 65 | 66 | if (tiles_config.layers[z][0] < tile.x) return null; 67 | if (tiles_config.layers[z][1] < tile.y) return null; 68 | 69 | var tx = ""+tile.x; 70 | var ty = ""+tile.y; 71 | while (tx.length < 2) tx = "0"+tx; 72 | while (ty.length < 2) ty = "0"+ty; 73 | 74 | var url = tiles_config.stem+'tile_z'+z+'_'+tx+'_'+ty+'.png'; 75 | //console.log(tile, url); 76 | 77 | return url; 78 | }, 79 | tileSize: new google.maps.Size(map_config.tileSize, map_config.tileSize), 80 | maxZoom: num_layers-1, 81 | minZoom: 0, 82 | isPng: false 83 | }; 84 | 85 | var WoWMapType = new google.maps.ImageMapType(WoWMapOptions); 86 | WoWMapType.name = "WoW Map"; 87 | WoWMapType.alt = "World of Warcraft Map"; 88 | WoWMapType.projection = new WoWMapProjection(); 89 | 90 | 91 | var mapOptions = { 92 | backgroundColor: tiles_config.bgcolor, 93 | zoom: map_config.defaultZoom, 94 | center: new google.maps.LatLng(tiles_config.center[0], tiles_config.center[1]), 95 | 96 | zoomControl: true, 97 | zoomControlOptions: { style: google.maps.ZoomControlStyle.LARGE }, 98 | panControl: false, 99 | rotateControl: false, 100 | overviewMapControl: false, 101 | scaleControl: false, 102 | mapTypeControl: false, 103 | streetViewControl: true, 104 | 105 | mapTypeId: 'WoWmap' 106 | }; 107 | map = new google.maps.Map(document.getElementById("map"), mapOptions); 108 | 109 | // Now attach the coordinate map type to the map's registry 110 | map.mapTypes.set('WoWmap', WoWMapType); 111 | 112 | // We can now set the map to use the 'coordinate' map type 113 | map.setMapTypeId('WoWmap'); 114 | 115 | 116 | 117 | 118 | // pano stuffs 119 | 120 | var nexus = new google.maps.LatLng(0.43359375, 1.1197509765625); 121 | 122 | var panoramaOptions = { 123 | pano: 'test1', 124 | panoProvider: getCustomPanorama, 125 | pov: { 126 | heading: 34, 127 | pitch: 10, 128 | zoom: 1 129 | }, 130 | enableCloseButton: true 131 | }; 132 | panorama = new google.maps.StreetViewPanorama(document.getElementById("pano") ,panoramaOptions); 133 | //map.setStreetView(panorama); 134 | 135 | google.maps.event.addListener(panorama, 'pano_changed', function(){ 136 | console.log('pano_changed', panorama.getPano()); 137 | }); 138 | 139 | google.maps.event.addListener(panorama, 'position_changed', function(){ 140 | console.log('position_changed', panorama.getPosition()); 141 | }); 142 | 143 | google.maps.event.addListener(panorama, 'visible_changed', function(){ 144 | console.log('visible_changed', panorama.getVisible()); 145 | set_sv_mode(!!panorama.getVisible()); 146 | }); 147 | 148 | var n = new google.maps.Marker({ 149 | map: map, 150 | position: PixelsToLatLng([768,1088]), 151 | }); 152 | 153 | 154 | 155 | 156 | 157 | rect_at_px(map, 16896, 11216, 17744, 11776); // 1519, Stormwind City 158 | rect_at_px(map, 15872, 11520, 17616, 12960); // 40, Westfall 159 | rect_at_px(map, 18096, 5888, 19200, 7008 ); // 28, Western Plaguelands 160 | rect_at_px(map, 18976, 5632, 20800, 6800 ); // 139, Eastern Plaguelands 161 | 162 | // deal with hash stuff 163 | hash_init(); 164 | google.maps.event.addListener(map, 'dragend', hash_update); 165 | google.maps.event.addListener(map, 'zoom_changed', hash_update); 166 | } 167 | 168 | function rect_at_px(map, x_min, y_min, x_max, y_max){ 169 | 170 | var ne = PixelsToLatLng([x_max/4, y_min/4]); 171 | var sw = PixelsToLatLng([x_min/4, y_max/4]); 172 | var rect = new google.maps.Rectangle({ 173 | strokeColor: "#FF0000", 174 | strokeOpacity: 0.8, 175 | strokeWeight: 2, 176 | fillColor: "#FF0000", 177 | fillOpacity: 0.35, 178 | map: map, 179 | bounds: new google.maps.LatLngBounds(sw,ne) 180 | }); 181 | } 182 | 183 | function hash_init(){ 184 | if (window.location.hash.split("/").length > 1){ 185 | hash_goto(); 186 | hash_update(); 187 | } 188 | } 189 | 190 | function hash_update(){ 191 | var pos = LatLngToPixels(map.getCenter()); 192 | var zoom = map.getZoom(); 193 | hash_set(pos[0], pos[1], zoom); 194 | } 195 | 196 | function hash_set(x, y, zoom){ 197 | window.location.replace("#/" + Math.floor(x) + "/" + Math.floor(y) + "/" + zoom + "/"); 198 | } 199 | 200 | function hash_goto(){ 201 | 202 | var coords = window.location.hash.split("/"); 203 | var latlng = PixelsToLatLng([parseInt(coords[1]), parseInt(coords[2])]); 204 | 205 | var zoom = parseInt(coords[3]); 206 | if (zoom < 0 || zoom > WoWMapOptions.maxZoom){ 207 | zoom = map_config.defaultZoom; 208 | } 209 | 210 | map.setCenter(latlng); 211 | map.setZoom(zoom); 212 | } 213 | 214 | 215 | 216 | $(document).ready(function(){ 217 | 218 | $("ul#nav > li > ul").parent().addClass("tophassub"); 219 | $("ul#nav ul ul").parent().addClass("subhassub"); 220 | $("li a.current").parents("li").children('a').addClass("current"); 221 | }); 222 | 223 | 224 | 225 | 226 | function wow_pano_provider(pano, zoom, tileX, tileY){ 227 | 228 | 229 | } 230 | 231 | function getCustomPanoramaTileUrl(panoID, zoom, tileX, tileY){ 232 | 233 | return "http://googlemaps.googlermania.com/google_maps_api_v3/en/custom_streetview/ardenwood_tiles/entrance_gate/" + tileX + '-' +tileY + '_s1.jpg'; 234 | } 235 | 236 | function getCustomPanorama(panoID){ 237 | 238 | if (panoID == 'test1'){ 239 | return { 240 | links: [], 241 | copyright: null, 242 | tiles: { 243 | tileSize: new google.maps.Size(256, 256), 244 | worldSize: new google.maps.Size(2048, 1024), 245 | centerHeading: 0, 246 | getTileUrl: getCustomPanoramaTileUrl 247 | }, 248 | location: { 249 | pano: 'test1', 250 | description: 'test 1 desc', 251 | latLng: new google.maps.LatLng(0.43359375, 1.1197509765625) 252 | } 253 | }; 254 | } 255 | 256 | console.log('failed to find pano', panoID); 257 | 258 | return null; 259 | } 260 | -------------------------------------------------------------------------------- /www/areas.js: -------------------------------------------------------------------------------- 1 | var map_config = { 2 | fileExt : 'png', 3 | tileSize : 256, 4 | defaultZoom : 0, 5 | cacheMinutes : 0, 6 | debug : false 7 | }; 8 | 9 | $(function(){ 10 | initialize(); 11 | $(window).resize(function(){ 12 | $('#map').css('width', $(window).width()+'px'); 13 | $('#map').css('height', ($(window).height()-35)+'px'); 14 | google.maps.event.trigger(map, 'resize'); 15 | hash_init(); // keeps the map centered correctly 16 | }).resize(); 17 | }); 18 | 19 | 20 | // 21 | // a very simple projection 22 | // 23 | 24 | function WoWMapProjection(){} 25 | 26 | WoWMapProjection.prototype.fromLatLngToPoint = function(latLng){ 27 | var x = latLng.lng() * map_config.tileSize; 28 | var y = latLng.lat() * map_config.tileSize; 29 | return new google.maps.Point(x, y); 30 | }; 31 | 32 | WoWMapProjection.prototype.fromPointToLatLng = function(point){ 33 | var lng = point.x * (1.0 / map_config.tileSize); 34 | var lat = point.y * (1.0 / map_config.tileSize); 35 | return new google.maps.LatLng(lat, lng); 36 | }; 37 | 38 | 39 | function LatLngToPixels(latLng){ 40 | 41 | var pnt = WoWMapProjection.prototype.fromLatLngToPoint(latLng); 42 | return [pnt.x * 8, pnt.y * 8]; 43 | } 44 | 45 | function PixelsToLatLng(pxs){ 46 | 47 | var pnt = {x: pxs[0] / 8, y: pxs[1] / 8}; 48 | return WoWMapProjection.prototype.fromPointToLatLng(pnt); 49 | } 50 | 51 | 52 | 53 | var map; 54 | var WoWMapOptions; 55 | 56 | function initialize() { 57 | 58 | // 59 | // the class for our map layer 60 | // 61 | 62 | var num_layers = 0; 63 | for (var i in tiles_config.layers) num_layers++; 64 | 65 | WoWMapOptions = { 66 | 67 | getTileUrl: function(tile, zoom) { 68 | 69 | //console.log(tile.x, tile.y); 70 | 71 | if (tile.x < 0 || tile.y < 0) return null; 72 | 73 | var z = 1 + ((num_layers-2) - zoom); 74 | 75 | if (tiles_config.layers[z][0] < tile.x) return null; 76 | if (tiles_config.layers[z][1] < tile.y) return null; 77 | 78 | var tx = ""+tile.x; 79 | var ty = ""+tile.y; 80 | while (tx.length < 2) tx = "0"+tx; 81 | while (ty.length < 2) ty = "0"+ty; 82 | 83 | var url = tiles_config.stem+'tile_z'+z+'_'+tx+'_'+ty+'.png'; 84 | //console.log(tile, url); 85 | 86 | return url; 87 | }, 88 | tileSize: new google.maps.Size(map_config.tileSize, map_config.tileSize), 89 | maxZoom: num_layers-1, 90 | minZoom: 0, 91 | isPng: false 92 | }; 93 | 94 | var WoWMapType = new google.maps.ImageMapType(WoWMapOptions); 95 | WoWMapType.name = "WoW Map"; 96 | WoWMapType.alt = "World of Warcraft Map"; 97 | WoWMapType.projection = new WoWMapProjection(); 98 | 99 | 100 | var mapOptions = { 101 | backgroundColor: tiles_config.bgcolor, 102 | zoom: map_config.defaultZoom, 103 | center: new google.maps.LatLng(tiles_config.center[0], tiles_config.center[1]), 104 | 105 | zoomControl: true, 106 | zoomControlOptions: { style: google.maps.ZoomControlStyle.LARGE }, 107 | panControl: false, 108 | rotateControl: false, 109 | overviewMapControl: false, 110 | scaleControl: false, 111 | mapTypeControl: false, 112 | streetViewControl: false, 113 | 114 | mapTypeId: 'WoWmap' 115 | }; 116 | map = new google.maps.Map(document.getElementById("map"), mapOptions); 117 | 118 | // Now attach the coordinate map type to the map's registry 119 | map.mapTypes.set('WoWmap', WoWMapType); 120 | 121 | // We can now set the map to use the 'coordinate' map type 122 | map.setMapTypeId('WoWmap'); 123 | 124 | // deal with hash stuff 125 | hash_init(); 126 | google.maps.event.addListener(map, 'dragend', hash_update); 127 | google.maps.event.addListener(map, 'zoom_changed', hash_update); 128 | 129 | draw_area(1519); // stormwind 130 | draw_area(12); // elwynn 131 | draw_area(85); // tirisfal 132 | 133 | //draw_label(1519); 134 | //draw_label(19); 135 | 136 | var c = 0; 137 | for (var i in areas){ 138 | c++; 139 | var long = calc_long_edge(areas[i]); 140 | //console.log(areas[i][4], long); 141 | if (long > 500) draw_label(i); 142 | //if (c>30) break; 143 | } 144 | 145 | } 146 | 147 | function hash_init(){ 148 | if (window.location.hash.split("/").length > 1){ 149 | hash_goto(); 150 | hash_update(); 151 | } 152 | } 153 | 154 | function hash_update(){ 155 | var pos = LatLngToPixels(map.getCenter()); 156 | var zoom = map.getZoom(); 157 | hash_set(pos[0], pos[1], zoom); 158 | } 159 | 160 | function hash_set(x, y, zoom){ 161 | window.location.replace("#/" + Math.floor(x) + "/" + Math.floor(y) + "/" + zoom + "/"); 162 | } 163 | 164 | function hash_goto(){ 165 | 166 | var coords = window.location.hash.split("/"); 167 | var latlng = PixelsToLatLng([parseInt(coords[1]), parseInt(coords[2])]); 168 | 169 | var zoom = parseInt(coords[3]); 170 | if (zoom < 0 || zoom > WoWMapOptions.maxZoom){ 171 | zoom = map_config.defaultZoom; 172 | } 173 | 174 | map.setCenter(latlng); 175 | map.setZoom(zoom); 176 | } 177 | 178 | 179 | 180 | $(document).ready(function(){ 181 | 182 | $("ul#nav > li > ul").parent().addClass("tophassub"); 183 | $("ul#nav ul ul").parent().addClass("subhassub"); 184 | $("li a.current").parents("li").children('a').addClass("current"); 185 | }); 186 | 187 | function draw_area(id){ 188 | 189 | var a = areas[id]; 190 | if (!a) return; 191 | 192 | var ne = PixelsToLatLng([a[2]/4, a[1]/4]); 193 | var sw = PixelsToLatLng([a[0]/4, a[3]/4]); 194 | var rect = new google.maps.Rectangle({ 195 | strokeColor: "#FF0000", 196 | strokeOpacity: 0.8, 197 | strokeWeight: 2, 198 | fillColor: "#FF0000", 199 | fillOpacity: 0.35, 200 | map: map, 201 | bounds: new google.maps.LatLngBounds(sw,ne) 202 | }); 203 | } 204 | 205 | function draw_label(id){ 206 | 207 | var a = areas[id]; 208 | if (!a) return; 209 | 210 | var x = (a[0]+a[2]) / 8; 211 | var y = (a[1]+a[3]) / 8; 212 | var ll = PixelsToLatLng([x,y]); 213 | 214 | // var marker = new google.maps.Marker({ 215 | // position: ll, 216 | // map: map, 217 | // title: a[4] 218 | // }); 219 | 220 | var overlay = new LabelOverlay(a[4], ll, map); 221 | } 222 | 223 | function LabelOverlay(label, ll, map){ 224 | this.ll_ = ll; 225 | this.label_ = label; 226 | this.map_ = map; 227 | this.div_ = null; 228 | this.setMap(map); 229 | } 230 | 231 | LabelOverlay.prototype = new google.maps.OverlayView(); 232 | 233 | LabelOverlay.prototype.onAdd = function(){ 234 | var div = document.createElement('div'); 235 | div.className = 'wow-label'; 236 | div.style.border = "none"; 237 | div.style.borderWidth = "0px"; 238 | div.style.position = "absolute"; 239 | div.innerHTML = this.label_; 240 | 241 | this.div_ = div; 242 | 243 | var panes = this.getPanes(); 244 | panes.overlayImage.appendChild(div); 245 | } 246 | 247 | LabelOverlay.prototype.draw = function(){ 248 | var can_show = map.getZoom() > 2; 249 | 250 | var overlayProjection = this.getProjection(); 251 | var xy = overlayProjection.fromLatLngToDivPixel(this.ll_); 252 | var div = this.div_; 253 | div.style.visibility = can_show ? 'visible' : 'hidden'; 254 | div.style.left = (xy.x - ($(div).width()/2)) + 'px'; 255 | div.style.top = (xy.y - ($(div).height()/2)) + 'px'; 256 | } 257 | 258 | LabelOverlay.prototype.onRemove = function() { 259 | this.div_.parentNode.removeChild(this.div_); 260 | this.div_ = null; 261 | } 262 | 263 | function calc_long_edge(a){ 264 | var x = Math.abs(a[0]-a[2]); 265 | var y = Math.abs(a[1]-a[3]); 266 | return Math.max(x,y); 267 | } 268 | -------------------------------------------------------------------------------- /www/index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | World of MapCraft 7 | 8 | 9 | 10 | 11 | 12 | 19 | 202 | 205 | 206 | 207 | 208 |
209 | 210 |
211 |
Source code
212 | 213 | 214 | 215 | $v"; 222 | }else{ 223 | return "$v"; 224 | } 225 | } 226 | function dead_link($v){ 227 | $v = str_replace(array_keys($GLOBALS['logo_map']), $GLOBALS['logo_map'], $v); 228 | return "$v"; 229 | } 230 | 231 | $logo_map = array( 232 | # '{BC}' => '', 233 | # '{Wrath}' => '', 234 | # '{Cata}' => '', 235 | # '{MoP}' => '', 236 | '{BC}' => '', 237 | '{Wrath}' => '', 238 | '{Cata}' => '', 239 | '{MoP}' => '', 240 | ); 241 | ?> 242 | 444 | 445 |
446 | 447 | 448 | 449 | -------------------------------------------------------------------------------- /www/areas.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | World of MapCraft 7 | 8 | 9 | 10 | 11 | 12 | 185 | 203 | 204 | 205 | 206 | 207 | 208 |
209 | 210 |
211 |
Source code
212 | 213 | 214 | 215 | $v"; 222 | }else{ 223 | return "$v"; 224 | } 225 | } 226 | function dead_link($v){ 227 | $v = str_replace(array_keys($GLOBALS['logo_map']), $GLOBALS['logo_map'], $v); 228 | return "$v"; 229 | } 230 | 231 | $logo_map = array( 232 | # '{BC}' => '', 233 | # '{Wrath}' => '', 234 | # '{Cata}' => '', 235 | # '{MoP}' => '', 236 | '{BC}' => '', 237 | '{Wrath}' => '', 238 | '{Cata}' => '', 239 | '{MoP}' => '', 240 | ); 241 | ?> 242 | 444 | 445 |
446 | 447 | 460 | 461 | 462 | 463 | -------------------------------------------------------------------------------- /www/pano.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | World of MapCraft 7 | 8 | 9 | 10 | 11 | 221 | 224 | 225 | 226 | 227 | 228 | 229 |
230 | 231 |
232 |
Source code
233 | 234 | 235 | 236 | $v"; 243 | }else{ 244 | return "$v"; 245 | } 246 | } 247 | function dead_link($v){ 248 | $v = str_replace(array_keys($GLOBALS['logo_map']), $GLOBALS['logo_map'], $v); 249 | return "$v"; 250 | } 251 | 252 | $logo_map = array( 253 | # '{BC}' => '', 254 | # '{Wrath}' => '', 255 | # '{Cata}' => '', 256 | # '{MoP}' => '', 257 | '{BC}' => '', 258 | '{Wrath}' => '', 259 | '{Cata}' => '', 260 | '{MoP}' => '', 261 | ); 262 | ?> 263 | 465 | 466 |
467 | 468 | 481 | 482 | 483 | 484 | -------------------------------------------------------------------------------- /www/areadata.js: -------------------------------------------------------------------------------- 1 | var areas = { 2 | 5144 : [15184, 9824, 16320, 11168, "Shimmering Expanse"], 3 | 4955 : [15088, 10160, 15360, 10752, "The Abyss"], 4 | 5146 : [14080, 9056, 16384, 11168, "Vashj'ir"], 5 | 4966 : [15792, 10880, 16128, 11168, "Beth'mora Ridge"], 6 | 214 : [14080, 4352, 17392, 5872, "The Great Sea"], 7 | 4706 : [16416, 7680, 17664, 8464, "Ruins of Gilneas"], 8 | 4815 : [14464, 9392, 16384, 10000, "Kelp Forest"], 9 | 298 : [17824, 8544, 18432, 8704, "Baradin Bay"], 10 | 1022 : [18368, 8800, 18432, 8960, "Bluegill Marsh"], 11 | 11 : [16896, 8448, 19696, 9472, "Wetlands"], 12 | 299 : [18304, 9088, 18368, 9360, "Menethil Bay"], 13 | 150 : [18208, 9104, 18336, 9312, "Menethil Harbor"], 14 | 2365 : [16896, 8448, 18240, 8704, "The Great Sea"], 15 | 328 : [18528, 8320, 18752, 8608, "The Drowned Reef"], 16 | 1023 : [18624, 8624, 18784, 8816, "Saltspray Glen"], 17 | 2364 : [15872, 11520, 16640, 12288, "The Great Sea"], 18 | 2339 : [15872, 13072, 17152, 13696, "The Great Sea"], 19 | 4922 : [19344, 8512, 21232, 9984, "Twilight Highlands"], 20 | 5142 : [20272, 8880, 20368, 8960, "Thundermar"], 21 | 5502 : [20208, 8896, 20224, 9216, "Thundermar Wreckage"], 22 | 5000 : [20048, 9024, 20240, 9344, "Verrall River"], 23 | 5138 : [20416, 9136, 20480, 9232, "Bloodgulch"], 24 | 4411 : [16896, 11232, 17424, 11536, "Stormwind Harbor"], 25 | 42 : [18416, 12416, 18432, 12624, "Darkshire"], 26 | 10 : [17552, 12160, 18704, 12800, "Duskwood"], 27 | 41 : [18672, 12192, 19040, 12800, "Deadwind Pass"], 28 | 2161 : [18416, 12624, 18432, 12768, "Roland's Doom"], 29 | 121 : [18496, 12624, 18576, 12784, "Tranquil Gardens Cemetery"], 30 | 5145 : [14144, 9712, 15376, 10912, "Abyssal Depths"], 31 | 5047 : [15136, 9888, 15376, 10416, "Abyssal Breach"], 32 | 130 : [16128, 6656, 17888, 7840, "Silverpine Forest"], 33 | 5456 : [16992, 7584, 17152, 7680, "The Battlefront"], 34 | 5481 : [17040, 7680, 17152, 7760, "7th Legion Base Camp"], 35 | 5433 : [16976, 7728, 17568, 7984, "The Greymane Wall"], 36 | 5440 : [16928, 7776, 17360, 7936, "Northern Headlands"], 37 | 5434 : [17104, 7808, 17216, 7936, "Forsaken Forward Command"], 38 | 1858 : [18848, 7904, 18944, 7936, "Boulder'gor"], 39 | 45 : [18528, 7520, 20480, 8608, "Arathi Highlands"], 40 | 320 : [19056, 7968, 19232, 8016, "Refuge Pointe"], 41 | 336 : [19184, 8016, 19232, 8112, "Circle of Outer Binding"], 42 | 335 : [18864, 8096, 19008, 8240, "Circle of Inner Binding"], 43 | 1 : [16896, 9312, 19008, 10752, "Dun Morogh"], 44 | 133 : [17584, 9824, 17680, 9952, "New Tinkertown"], 45 | 5178 : [17616, 9936, 17728, 9984, "The Toxic Airfield"], 46 | 135 : [17504, 10016, 17744, 10256, "Frostmane Hold"], 47 | 2277 : [19184, 5760, 19200, 6144, "Plaguewood"], 48 | 2627 : [19184, 5936, 19200, 6080, "Terrordale"], 49 | 4067 : [19360, 5968, 19408, 6016, "Plaguewood Tower"], 50 | 836 : [19008, 9328, 19152, 9472, "Dun Algaz"], 51 | 38 : [19008, 9616, 20000, 10304, "Loch Modan"], 52 | 837 : [19184, 9616, 19248, 9696, "Dun Algaz"], 53 | 925 : [19152, 9664, 19200, 9792, "Algaz Station"], 54 | 838 : [19088, 9680, 19152, 9776, "North Gate Pass"], 55 | 19 : [18400, 12832, 18944, 13536, "Zul'Gurub"], 56 | 33 : [15872, 12816, 18944, 14080, "Northern Stranglethorn"], 57 | 2 : [16528, 11776, 16896, 12800, "Longshore"], 58 | 40 : [15872, 11520, 17616, 12960, "Westfall"], 59 | 12 : [17056, 10912, 18688, 12320, "Elwynn Forest"], 60 | 5398 : [17360, 11216, 17408, 11296, "Stormwind City Outskirts"], 61 | 85 : [16544, 5856, 18496, 6704, "Tirisfal Glades"], 62 | 152 : [18224, 6480, 18304, 6656, "The Bulwark"], 63 | 28 : [18096, 5888, 19200, 7008, "Western Plaguelands"], 64 | 284 : [17952, 6736, 18016, 7008, "The Uplands"], 65 | 172 : [17504, 6848, 17664, 6912, "Fenris Isle"], 66 | 232 : [17696, 6832, 17888, 6912, "The Dawning Isles"], 67 | 1339 : [17664, 6752, 17936, 7040, "Lordamere Lake"], 68 | 1338 : [17408, 6768, 17536, 6912, "Lordamere Lake"], 69 | 1681 : [17808, 7008, 17952, 7120, "Misty Shore"], 70 | 281 : [17904, 6976, 18016, 7280, "Ruins of Alterac"], 71 | 279 : [17664, 7152, 17936, 7424, "Dalaran Crater"], 72 | 2338 : [16128, 13616, 16384, 14080, "South Seas"], 73 | 5397 : [17504, 11264, 17552, 11360, "The Wollerton Stead"], 74 | 5316 : [17552, 11296, 17600, 11392, "Olivia's Pond"], 75 | 1519 : [16896, 11216, 17744, 11776, "Stormwind City"], 76 | 5346 : [17440, 11376, 17488, 11488, "Stormwind City Cemetery"], 77 | 5314 : [17488, 11392, 17584, 11488, "Stormwind Lake"], 78 | 5150 : [17584, 11408, 17648, 11536, "Dwarven District"], 79 | 5390 : [17440, 11472, 17584, 11712, "The Canals"], 80 | 5151 : [17472, 11504, 17568, 11600, "Cathedral Square"], 81 | 351 : [19680, 7168, 19712, 7280, "Skulk Rock"], 82 | 356 : [19664, 6800, 19968, 7168, "Seradane"], 83 | 47 : [18752, 6752, 20736, 7760, "The Hinterlands"], 84 | 5323 : [19888, 7248, 19920, 7280, "Stormfeather Outpost"], 85 | 63 : [17664, 12112, 17776, 12272, "The Stonefield Farm"], 86 | 57 : [17776, 12112, 17840, 12288, "Fargodeep Mine"], 87 | 5176 : [17824, 12112, 17856, 12144, "Goldtooth's Den"], 88 | 64 : [17840, 12144, 17936, 12272, "The Maclure Vineyards"], 89 | 60 : [17504, 11920, 17664, 12320, "Forest's Edge"], 90 | 799 : [17552, 12160, 17664, 12384, "The Darkened Bank"], 91 | 5441 : [17312, 7936, 17408, 8016, "Emberstone Village"], 92 | 5444 : [17248, 8016, 17280, 8048, "Rutsak's Guard"], 93 | 5435 : [17056, 8064, 17152, 8304, "Gilneas City"], 94 | 4736 : [16688, 7680, 16768, 7744, "The Bite"], 95 | 134 : [18608, 10128, 18688, 10272, "Gol'Bolar Quarry"], 96 | 716 : [18800, 10192, 18960, 10240, "Ironband's Compound"], 97 | 51 : [17952, 10336, 18992, 10976, "Searing Gorge"], 98 | 1959 : [18752, 10384, 18992, 10496, "Dustfire Valley"], 99 | 219 : [16960, 12448, 17104, 12656, "Alexston Farmstead"], 100 | 919 : [17200, 12528, 17312, 12544, "Stendel's Pond"], 101 | 108 : [17312, 12368, 17504, 12544, "Sentinel Hill"], 102 | 20 : [17120, 12624, 17152, 12800, "Moonbrook"], 103 | 922 : [17360, 12656, 17408, 12864, "The Dust Plains"], 104 | 920 : [17056, 12704, 17248, 12960, "The Dagger Hills"], 105 | 5143 : [20448, 8640, 20480, 8704, "Kirthaven"], 106 | 5609 : [20496, 8928, 20624, 9056, "The Black Sunder"], 107 | 1000 : [19392, 11680, 19456, 11776, "Galardell Valley"], 108 | 44 : [18736, 11520, 19968, 12192, "Redridge Mountains"], 109 | 96 : [19488, 11856, 19536, 11904, "Tower of Ilgalar"], 110 | 71 : [19408, 11920, 19456, 12000, "Stonewatch Falls"], 111 | 5324 : [19552, 11952, 19616, 12064, "Shalewind Canyon"], 112 | 997 : [19360, 11984, 19456, 12192, "Render's Valley"], 113 | 5115 : [18592, 9536, 18768, 9984, "Ironforge Airfield"], 114 | 138 : [18352, 9904, 18432, 9984, "Misty Pine Refuge"], 115 | 3 : [18896, 10304, 20224, 11008, "Badlands"], 116 | 5497 : [20096, 10528, 20224, 10656, "Fuselight-by-the-Sea"], 117 | 5439 : [20096, 8688, 20240, 8704, "Ruins of Drakgor Encampment"], 118 | 5640 : [20080, 8800, 20224, 8928, "Humboldt Conflagration"], 119 | 5639 : [20000, 8832, 20208, 9088, "Glopgut's Hollow"], 120 | 301 : [17072, 12912, 17152, 13312, "The Savage Coast"], 121 | 104 : [17504, 13216, 17664, 13312, "The Vile Reef"], 122 | 1578 : [17360, 13488, 17712, 14240, "Southern Savage Coast"], 123 | 556 : [19408, 9728, 19456, 10048, "The Loch"], 124 | 147 : [19856, 10048, 20000, 10288, "The Farstrider Lodge"], 125 | 142 : [19696, 10064, 19824, 10304, "Ironband's Excavation Site"], 126 | 9 : [17888, 11536, 18192, 11808, "Northshire Valley"], 127 | 59 : [18032, 11648, 18176, 11776, "Northshire Vineyards"], 128 | 54 : [18160, 11776, 18304, 11936, "Jasperlode Mine"], 129 | 18 : [17952, 11840, 18192, 12032, "Crystal Lake"], 130 | 87 : [17824, 11904, 17920, 12016, "Goldshire"], 131 | 8 : [18976, 11264, 20224, 12800, "Swamp of Sorrows"], 132 | 76 : [19584, 12144, 19648, 12288, "Fallow Sanctuary"], 133 | 1798 : [19328, 12192, 19456, 12288, "The Shifting Mire"], 134 | 5459 : [19696, 12256, 19792, 12336, "Marshtide Watch"], 135 | 2403 : [19728, 11264, 20224, 12800, "The Forbidding Sea"], 136 | 46 : [18048, 10960, 19456, 11520, "Burning Steppes"], 137 | 2417 : [19088, 11408, 19200, 11520, "Blackrock Pass"], 138 | 996 : [18960, 11536, 19136, 11696, "Render's Camp"], 139 | 998 : [18992, 11552, 19040, 11616, "Render's Rock"], 140 | 95 : [18848, 11616, 18896, 11824, "Redridge Canyons"], 141 | 5321 : [18928, 11664, 18944, 11680, "Yowler's Den"], 142 | 97 : [19136, 11744, 19248, 11776, "Alther's Mill"], 143 | 139 : [18976, 5632, 20800, 6800, "Eastern Plaguelands"], 144 | 2037 : [18272, 5136, 19712, 5632, "Quel'thalas"], 145 | 168 : [17648, 5856, 17936, 6048, "The North Coast"], 146 | 246 : [18416, 10608, 18704, 10720, "The Cauldron"], 147 | 1444 : [18560, 10752, 18800, 10976, "The Sea of Cinders"], 148 | 5628 : [18464, 10800, 18560, 10864, "Iron Summit"], 149 | 1445 : [18384, 10880, 18432, 10976, "Blackrock Mountain"], 150 | 254 : [18304, 10976, 18432, 11280, "Blackrock Mountain"], 151 | 2397 : [17664, 8048, 18176, 8192, "The Great Sea"], 152 | 896 : [17584, 7952, 17664, 8112, "Purgation Isle"], 153 | 2400 : [19872, 6848, 20736, 7168, "The Forbidding Sea"], 154 | 2401 : [19376, 7936, 20480, 8192, "The Forbidding Sea"], 155 | 1617 : [17600, 11648, 17664, 11776, "Valley of Heroes"], 156 | 92 : [17632, 11856, 17664, 11952, "Mirror Lake"], 157 | 89 : [17632, 11952, 17664, 11984, "Mirror Lake Orchard"], 158 | 2562 : [18784, 12672, 18944, 12800, "Karazhan"], 159 | 2561 : [18896, 12560, 18944, 12688, "The Vice"], 160 | 1441 : [19088, 12784, 19184, 12800, "Altar of Storms"], 161 | 4 : [18944, 12528, 19792, 13568, "Blasted Lands"], 162 | 73 : [18944, 12944, 19248, 13104, "The Tainted Scar"], 163 | 308 : [19936, 5632, 21248, 5888, "The Forbidding Sea"], 164 | 5137 : [20912, 8576, 20992, 8704, "The Krazzworks"], 165 | 5436 : [17392, 8320, 17408, 8464, "Tempest's Reach"], 166 | 4974 : [14608, 10400, 14800, 10912, "Coldlight Chasm"], 167 | 4977 : [14848, 10528, 15120, 10752, "Korthun's End"], 168 | 4971 : [14448, 10320, 14592, 10496, "L'ghorek"], 169 | 5135 : [14160, 10384, 14608, 10896, "Abandoned Reef"], 170 | 4967 : [15360, 10496, 15632, 11040, "Ruins of Vashj'ir"], 171 | 5101 : [14592, 9904, 14848, 9984, "Deepfin Ridge"], 172 | 5107 : [14896, 9904, 15008, 9984, "Sira'kess Front"], 173 | 5103 : [14624, 10080, 14848, 10240, "Fireplume Trench"], 174 | 5102 : [14992, 10080, 15136, 10208, "Nightmare Depths"], 175 | 5134 : [14848, 10208, 14976, 10544, "Seabrush"], 176 | 5044 : [18976, 13104, 19312, 13312, "The Tainted Forest"], 177 | 5085 : [19072, 13264, 19136, 13328, "Maldraz"], 178 | 4961 : [15632, 10112, 15952, 10240, "Silver Tide Trench"], 179 | 5007 : [16192, 10320, 16320, 10512, "Ruins of Thelserai Temple"], 180 | 4962 : [15856, 10368, 16128, 10496, "Nespirah"], 181 | 120 : [17552, 11984, 17632, 12032, "Westbrook Garrison"], 182 | 916 : [17392, 12048, 17408, 12192, "The Jansen Stead"], 183 | 107 : [17312, 12240, 17424, 12384, "Saldean's Farm"], 184 | 5174 : [17584, 12272, 17616, 12304, "Hogger Hill"], 185 | 5096 : [19056, 12784, 19712, 13568, "The Forbidding Sea"], 186 | 2297 : [18816, 6592, 19056, 6912, "Darrowmere Lake"], 187 | 2298 : [19024, 6736, 19200, 6912, "Caer Darrow"], 188 | 1882 : [19056, 7040, 19152, 7280, "Plaguemist Ravine"], 189 | 116 : [19008, 12208, 19200, 12368, "Misty Valley"], 190 | 657 : [19216, 12224, 19328, 12288, "The Harborage"], 191 | 1780 : [19152, 12368, 19200, 12448, "Splinterspear Junction"], 192 | 75 : [19408, 12400, 19552, 12528, "Stonard"], 193 | 34 : [17936, 11536, 18032, 11616, "Echo Ridge Mine"], 194 | 314 : [19312, 8064, 19456, 8192, "Go'Shek Farm"], 195 | 317 : [19296, 8144, 19664, 8192, "Witherbark Village"], 196 | 267 : [17584, 6736, 18688, 8192, "Hillsbrad Foothills"], 197 | 278 : [17792, 7424, 17840, 7504, "Lordamere Internment Camp"], 198 | 5604 : [17856, 7504, 17904, 7552, "Sludgeguard Tower"], 199 | 286 : [17840, 7552, 17920, 7760, "The Sludge Fields"], 200 | 285 : [17696, 7648, 17760, 7760, "Southpoint Gate"], 201 | 153 : [17664, 6464, 17920, 6656, "Ruins of Lordaeron"], 202 | 36 : [17904, 6736, 18528, 7168, "Alterac Mountains"], 203 | 1682 : [18000, 6768, 18112, 6960, "Dandred's Fold"], 204 | 4546 : [20608, 6176, 20736, 6656, "Ruins of the Scarlet Enclave"], 205 | 307 : [19968, 6928, 20352, 7424, "The Overlook Cliffs"], 206 | 5100 : [14784, 10240, 14816, 10288, "Promontory Point"], 207 | 5083 : [19328, 13280, 19408, 13312, "Sunveil Excursion"], 208 | 5078 : [19344, 13200, 19584, 13520, "The Red Reaches"], 209 | 5084 : [19264, 13488, 19360, 13552, "Surwich"], 210 | 105 : [18304, 13280, 18432, 13312, "Mosh'Ogg Ogre Mound"], 211 | 1898 : [19616, 10464, 19712, 10624, "Dustwind Gulch"], 212 | 339 : [19712, 10448, 19936, 10848, "Lethlor Ravine"], 213 | 5496 : [19728, 10560, 19856, 10640, "Fuselight"], 214 | 918 : [17152, 12272, 17312, 12288, "The Molsen Farm"], 215 | 5290 : [17056, 12368, 17152, 12464, "The Raging Chasm"], 216 | 5462 : [19520, 9104, 19712, 9456, "Wyrms' Bend"], 217 | 5473 : [19664, 9328, 19968, 9872, "The Twilight Citadel"], 218 | 5563 : [19728, 9376, 20032, 9472, "Loch Verrall"], 219 | 5615 : [18320, 10608, 18432, 10752, "Pyrox Flats"], 220 | 1957 : [18256, 10832, 18352, 10944, "Blackchar Cave"], 221 | 255 : [18208, 10992, 18304, 11152, "Altar of Storms"], 222 | 477 : [17888, 13792, 17920, 13872, "Ruins of Jubuwal"], 223 | 1577 : [17536, 13552, 17824, 14336, "Cape of Stranglethorn"], 224 | 310 : [18048, 13744, 18176, 13824, "Crystalvein Mine"], 225 | 302 : [17936, 13824, 18288, 14576, "The Crystal Shore"], 226 | 311 : [18000, 13920, 18112, 14064, "Ruins of Aboraz"], 227 | 5408 : [17920, 13936, 17984, 14000, "Explorers' League Digsite"], 228 | 1742 : [17904, 14016, 17920, 14064, "Spirit Den"], 229 | 1737 : [17808, 14064, 17904, 14224, "Mistvale Valley"], 230 | 5155 : [19536, 8672, 19712, 8928, "Vermillion Redoubt"], 231 | 5461 : [19696, 9056, 19712, 9168, "Dragonmaw Pass"], 232 | 1878 : [19120, 10528, 19200, 10784, "The Dustbowl"], 233 | 5322 : [19184, 10576, 19504, 10720, "Scar of the Worldbreaker"], 234 | 2420 : [19168, 10960, 19456, 11264, "Terror Wing Path"], 235 | 43 : [17520, 14208, 18192, 14736, "Wild Shore"], 236 | 1740 : [18144, 13104, 18176, 13264, "Venture Co. Base Camp"], 237 | 127 : [18224, 13376, 18304, 13504, "Balia'mah Ruins"], 238 | 128 : [18128, 13456, 18176, 13552, "Ziata'jai Ruins"], 239 | 283 : [18064, 6944, 18176, 7088, "Slaughter Hollow"], 240 | 282 : [18160, 7024, 18176, 7104, "Crushridge Hold"], 241 | 280 : [18272, 7040, 18368, 7168, "Strahnbrad"], 242 | 1357 : [18112, 7120, 18176, 7296, "Gallows' Corner"], 243 | 35 : [17568, 14240, 17776, 14336, "Booty Bay"], 244 | 1017 : [19392, 8816, 19456, 8960, "Raptor Ridge"], 245 | 1025 : [19104, 8832, 19216, 8960, "The Green Belt"], 246 | 1038 : [19600, 9008, 19696, 9168, "Dragonmaw Gates"], 247 | 5472 : [20032, 9424, 20160, 9472, "Citadel Gates"], 248 | 5471 : [20192, 9712, 20272, 9728, "Crushblow"], 249 | 5503 : [20064, 9840, 20144, 9920, "Altar of Ascension"], 250 | 5584 : [20192, 9888, 20304, 9984, "Twilight Altar of Storms"], 251 | 1741 : [17696, 13648, 17904, 13920, "Gurubashi Arena"], 252 | 2177 : [17760, 13728, 17808, 13792, "Battle Ring"], 253 | 249 : [19088, 11008, 19248, 11264, "Dreadmaul Rock"], 254 | 2418 : [19184, 11408, 19296, 11488, "Morgan's Vigil"], 255 | 252 : [18512, 11024, 18560, 11168, "Blackrock Stronghold"], 256 | 5653 : [18560, 11088, 18784, 11264, "Fields of Honor"], 257 | 2398 : [16128, 6656, 16384, 7168, "The Great Sea"], 258 | 1684 : [18528, 6960, 18688, 7168, "Chillwind Point"], 259 | 3486 : [18576, 7360, 18688, 7472, "Ravenholdt Manor"], 260 | 272 : [18272, 7360, 18448, 7520, "Tarren Mill"], 261 | 5479 : [20832, 9056, 21024, 9264, "Slithering Cove"], 262 | 318 : [19680, 7840, 19712, 7936, "Drywhisker Gorge"], 263 | 5317 : [18304, 13216, 18384, 13280, "Bambala"], 264 | 5425 : [20768, 9440, 21120, 9472, "Twilight Shore"], 265 | 5140 : [21024, 9616, 21232, 9872, "Highbank"], 266 | 5305 : [19184, 8944, 19296, 8960, "Greenwarden's Grove"], 267 | 1020 : [19232, 9072, 19456, 9312, "Mosshide Fen"], 268 | 4975 : [15056, 10464, 15168, 10592, "Tenebrous Cavern"], 269 | 2625 : [19808, 5872, 19904, 5888, "Eastwall Gate"], 270 | 2276 : [19888, 5760, 19968, 5888, "Quel'Lithien Lodge"], 271 | 2275 : [19952, 5856, 20032, 5888, "Northpass Tower"], 272 | 2624 : [19824, 6112, 19968, 6288, "Blackwood Lake"], 273 | 1678 : [18256, 7216, 18352, 7360, "Sofera's Naze"], 274 | 1679 : [18096, 7296, 18176, 7488, "Corrahn's Dagger"], 275 | 1036 : [18864, 8992, 18912, 9104, "Angerfang Encampment"], 276 | 197 : [18640, 6784, 18688, 6960, "Sorrow Hill"], 277 | 5426 : [18768, 6880, 18800, 6912, "Path of Uther"], 278 | 5427 : [18816, 6880, 18864, 6912, "Sorrow Hill Crypt"], 279 | 2265 : [20176, 6576, 20224, 6656, "Death Cultist Base Camp"], 280 | 2266 : [20368, 6496, 20480, 6656, "Tyr's Hand"], 281 | 242 : [18208, 12272, 18464, 12288, "Brightwood Grove"], 282 | 1098 : [18480, 12320, 18576, 12432, "Manor Mistmantle"], 283 | 576 : [18608, 12320, 18704, 12432, "Beggar's Haunt"], 284 | 801 : [17712, 9744, 17968, 9984, "Chill Breeze Valley"], 285 | 137 : [17744, 9984, 17808, 10032, "Brewnall Village"], 286 | 211 : [17760, 9824, 17936, 9984, "Iceflow Lake"], 287 | 294 : [18128, 7856, 18176, 8128, "Eastern Strand"], 288 | 305 : [16704, 6784, 16896, 7168, "North Tide's Run"], 289 | 928 : [16992, 6896, 17168, 7088, "North Tide's Beachhead"], 290 | 5386 : [17136, 6864, 17216, 6912, "Forsaken Rear Guard"], 291 | 228 : [17104, 7120, 17264, 7232, "The Sepulcher"], 292 | 324 : [18592, 8128, 18688, 8320, "Stromgarde Keep"], 293 | 327 : [18688, 8368, 18976, 8448, "Faldir's Cove"], 294 | 352 : [19024, 7408, 19136, 7424, "Zun'watha"], 295 | 1887 : [19104, 7488, 19216, 7552, "Bogen's Ledge"], 296 | 5483 : [20240, 9584, 20448, 9728, "Dunwald Ruins"], 297 | 5594 : [20400, 9424, 20736, 9472, "Highland Forest"], 298 | 1056 : [18064, 7488, 18176, 7632, "Darrow Hill"], 299 | 2560 : [18912, 12400, 18960, 12480, "Ariden's Camp"], 300 | 2697 : [18720, 12416, 18768, 12464, "Deadman's Crossing"], 301 | 2558 : [18720, 12464, 18880, 12672, "Deadwind Ravine"], 302 | 2938 : [18848, 12496, 18896, 12624, "Sleeping Gorge"], 303 | 5353 : [20624, 9088, 20736, 9248, "Verrall River Mouth"], 304 | 5136 : [20896, 9216, 21200, 9472, "Dragonmaw Port"], 305 | 2260 : [19392, 6464, 19536, 6592, "The Marris Stead"], 306 | 5446 : [19312, 6576, 19408, 6736, "Death's Step"], 307 | 2261 : [19424, 6608, 19552, 6656, "The Undercroft"], 308 | 1446 : [18416, 10496, 18432, 10608, "Thorium Point"], 309 | 102 : [17520, 12928, 17664, 13088, "Ruins of Zul'Kunda"], 310 | 100 : [17872, 12976, 17968, 13056, "Nesingwary's Expedition"], 311 | 5421 : [18560, 6336, 18880, 6400, "Redpine Dell"], 312 | 200 : [18624, 6480, 18688, 6592, "Dalson's Farm"], 313 | 5367 : [18704, 6512, 18768, 6576, "The Menders' Stead"], 314 | 193 : [18480, 6640, 18688, 6656, "Andorhal"], 315 | 61 : [17456, 11840, 17504, 12000, "Thunder Falls"], 316 | 927 : [17344, 6688, 17488, 6880, "The Shining Strand"], 317 | 295 : [17664, 7856, 18128, 8080, "Western Strand"], 318 | 289 : [18288, 7760, 18448, 7920, "Nethander Stead"], 319 | 290 : [18384, 7888, 18512, 7936, "Dun Garok"], 320 | 162 : [17856, 6096, 18032, 6144, "Brightwater Lake"], 321 | 459 : [18096, 5920, 18176, 6144, "Scarlet Watch Post"], 322 | 163 : [17920, 6160, 17984, 6224, "Gunther's Retreat"], 323 | 173 : [18160, 6160, 18192, 6192, "Faol's Rest"], 324 | 167 : [18080, 6336, 18240, 6400, "Crusader Outpost"], 325 | 1777 : [19072, 12448, 19200, 12544, "Purespring Cavern"], 326 | 1437 : [19152, 12576, 19232, 12784, "Dreadmaul Hold"], 327 | 5603 : [18400, 7696, 18448, 7744, "Eastpoint Tower"], 328 | 271 : [18096, 7728, 18176, 7920, "Ruins of Southshore"], 329 | 300 : [19760, 11936, 19984, 12688, "Misty Reed Strand"], 330 | 3357 : [17248, 13040, 17328, 13056, "Yojamba Isle"], 331 | 2399 : [16912, 5856, 17344, 5888, "The Great Sea"], 332 | 1001 : [18912, 12016, 19280, 12128, "Lakeridge Highway"], 333 | 5059 : [16208, 9904, 16384, 9984, "Holding Pens"], 334 | 354 : [19648, 7488, 19984, 7728, "Jintha'Alor"], 335 | 56 : [18384, 11760, 18448, 11776, "Heroes' Vigil"], 336 | 86 : [18224, 11584, 18624, 11776, "Stone Cairn Lake"], 337 | 88 : [18448, 11856, 18688, 12048, "Eastvale Logging Camp"], 338 | 169 : [16864, 5856, 17408, 5888, "Whispering Shore"], 339 | 999 : [19296, 11776, 19344, 11920, "Stonewatch Tower"], 340 | 70 : [19328, 11760, 19424, 11776, "Stonewatch"], 341 | 5325 : [19360, 11792, 19408, 11824, "Keeshan's Post"], 342 | 68 : [18848, 11840, 18944, 11936, "Lake Everstill"], 343 | 5326 : [19264, 11936, 19296, 11984, "Camp Everstill"], 344 | 802 : [17968, 9808, 18080, 9984, "Shimmer Ridge"], 345 | 131 : [18112, 10000, 18208, 10176, "Kharanos"], 346 | 136 : [17968, 10080, 18096, 10256, "The Grizzled Den"], 347 | 5077 : [19616, 12784, 19744, 12800, "Shattershore"], 348 | 288 : [17744, 7760, 17904, 7936, "Azurelode Mine"], 349 | 5318 : [17936, 13536, 18064, 13568, "The Sundering"], 350 | 5320 : [18096, 13568, 18144, 13600, "Fort Livingston"], 351 | 5438 : [20240, 8608, 20400, 8704, "Weeping Wound"], 352 | 243 : [17680, 12336, 17776, 12416, "Forlorn Rowe"], 353 | 492 : [17680, 12336, 17856, 12512, "Raven Hill Cemetery"], 354 | 1097 : [17552, 12352, 17664, 12544, "The Hushed Bank"], 355 | 94 : [17696, 12512, 17776, 12608, "Raven Hill"], 356 | 189 : [18176, 10000, 18272, 10096, "Steelgrill's Depot"], 357 | 5098 : [18304, 10112, 18416, 10256, "Frostmane Retreat"], 358 | 5097 : [18144, 10176, 18208, 10320, "Frostmane Front"], 359 | 804 : [18416, 10144, 18432, 10288, "The Tundrid Hills"], 360 | 157 : [17344, 5936, 17584, 6144, "Agamand Mills"], 361 | 164 : [17648, 6016, 17664, 6128, "Garren's Haunt"], 362 | 165 : [18064, 6400, 18240, 6528, "Balnir Farmstead"], 363 | 936 : [19216, 10048, 19456, 10240, "Grizzlepaw Ridge"], 364 | 316 : [19200, 8320, 19328, 8432, "Boulderfist Hall"], 365 | 321 : [19568, 7760, 19680, 7936, "Hammerfall"], 366 | 126 : [17840, 13056, 17920, 13136, "Tkashi Ruins"], 367 | 123 : [17728, 13152, 17792, 13216, "Bal'lal Ruins"], 368 | 125 : [17856, 13216, 17968, 13296, "Kal'ai Ruins"], 369 | 5149 : [17680, 11552, 17744, 11632, "Old Town"], 370 | 202 : [18768, 6672, 18848, 6768, "The Writhing Haunt"], 371 | 5079 : [19728, 13216, 19792, 13264, "Rockpool Village"], 372 | 297 : [17936, 14320, 18096, 14336, "Jaguero Isle"], 373 | 1885 : [19232, 7392, 19312, 7424, "Hiri'watha Research Station"], 374 | 1883 : [19360, 7376, 19520, 7424, "Valorwind Lake"], 375 | 353 : [19200, 7504, 19344, 7728, "Shadra'Alor"], 376 | 355 : [19408, 7456, 19600, 7632, "The Altar of Zul"], 377 | 803 : [18480, 10000, 18560, 10144, "Amberstill Ranch"], 378 | 2258 : [19600, 6160, 19744, 6336, "The Fungal Vale"], 379 | 5595 : [20496, 9552, 20656, 9952, "Obsidian Forest"], 380 | 1057 : [18544, 7584, 18608, 7936, "Thoradin's Wall"], 381 | 1857 : [18576, 7632, 18640, 7936, "Thoradin's Wall"], 382 | 348 : [18816, 7216, 18992, 7328, "Aerie Peak"], 383 | 349 : [18912, 7232, 18960, 7296, "Wildhammer Keep"], 384 | 1880 : [18896, 7360, 18960, 7424, "Featherbeard's Hovel"], 385 | 536 : [17680, 12608, 17920, 12800, "Addle's Stead"], 386 | 93 : [17904, 12656, 18080, 12784, "Vul'Gol Ogre Mound"], 387 | 800 : [17792, 10256, 17936, 10368, "Coldridge Pass"], 388 | 132 : [17488, 10288, 17632, 10496, "Coldridge Valley"], 389 | 129 : [17952, 13360, 17984, 13456, "Mizjah Ruins"], 390 | 5051 : [16048, 9472, 16128, 9664, "Honor's Tomb"], 391 | 4953 : [16064, 9664, 16240, 9824, "Kelp Forest"], 392 | 5071 : [16240, 9664, 16288, 9712, "Gorrok's Lament"], 393 | 5070 : [16224, 9680, 16240, 9712, "Budd's Dig"], 394 | 315 : [19216, 7824, 19360, 7936, "Dabyrie's Farmstead"], 395 | 4917 : [17104, 6224, 17200, 6352, "Scarlet Palisade"], 396 | 154 : [16992, 6368, 17184, 6704, "Deathknell"], 397 | 5177 : [17840, 9744, 17952, 9808, "Crushcog's Arsenal"], 398 | 5409 : [17312, 11552, 17488, 11664, "The Old Barracks"], 399 | 5469 : [20016, 5824, 20128, 5888, "Siege Vise"], 400 | 2273 : [20128, 5680, 20240, 5936, "Zul'Mashar"], 401 | 5463 : [20144, 6032, 20256, 6112, "Ix'lar's Domain"], 402 | 2271 : [20128, 6112, 20288, 6144, "Eastwall Tower"], 403 | 1021 : [19120, 9232, 19200, 9360, "Thelgen Rock"], 404 | 5074 : [19232, 9392, 19264, 9424, "Slabchisel's Survey"], 405 | 251 : [18912, 11008, 18944, 11056, "Flame Crest"], 406 | 250 : [18784, 10976, 18944, 11248, "Ruins of Thaurissan"], 407 | 2621 : [20000, 6528, 20176, 6656, "Lake Mereldar"], 408 | 5008 : [15760, 9920, 16112, 10240, "Shimmering Grotto"], 409 | 146 : [19392, 9616, 19648, 9744, "Stonewrought Dam"], 410 | 149 : [19248, 9648, 19360, 9856, "Silver Stream Mine"], 411 | 5052 : [15920, 9472, 16064, 9712, "Legion's Fate"], 412 | 1440 : [19552, 12832, 19584, 12864, "Serpent's Coil"], 413 | 72 : [19296, 12976, 19504, 13200, "The Dark Portal"], 414 | 2279 : [19440, 5776, 19648, 5888, "Stratholme"], 415 | 213 : [17360, 7216, 17408, 7296, "Deep Elem Mine"], 416 | 233 : [17360, 7376, 17408, 7424, "Ambermill"], 417 | 1739 : [17536, 13744, 17616, 13952, "Hardwrench Hideaway"], 418 | 5424 : [20912, 9728, 20992, 9920, "Obsidian Breakers"], 419 | 5139 : [19968, 9056, 20048, 9136, "The Gullet"], 420 | 5641 : [20032, 9184, 20176, 9328, "The Twilight Sunder"], 421 | 69 : [18864, 11808, 18944, 11872, "Lakeshire"], 422 | 5089 : [15600, 10576, 15616, 10752, "Quel'Dormir Gardens"], 423 | 5173 : [15680, 10896, 15792, 10960, "The Severed Span"], 424 | 350 : [19168, 7200, 19200, 7312, "Quel'Danil Lodge"], 425 | 1024 : [18448, 8736, 18688, 9008, "Sundown Marsh"], 426 | 118 : [18720, 8992, 18800, 9200, "Whelgar's Excavation Site"], 427 | 247 : [18704, 10768, 18816, 10848, "Grimesilt Dig Site"], 428 | 5592 : [19056, 10496, 19120, 10608, "The Hidden Clutch"], 429 | 340 : [18928, 10560, 18944, 10672, "Ruins of Kargath"], 430 | 5565 : [19008, 10608, 19168, 10752, "New Kargath"], 431 | 245 : [18112, 12672, 18208, 12800, "The Yorgen Farmstead"], 432 | 5437 : [20160, 8608, 20240, 8672, "Circle of Elements"], 433 | 198 : [19008, 6272, 19136, 6400, "The Weeping Cave"], 434 | 2620 : [19008, 6048, 19056, 6144, "Thondroril River"], 435 | 2619 : [19056, 6048, 19152, 6144, "Thondroril River"], 436 | 5411 : [19008, 6432, 19136, 6496, "Malicia's Outpost"], 437 | 201 : [18960, 6560, 19024, 6656, "Gahrron's Withering"], 438 | 99 : [17984, 12832, 18048, 12896, "Rebel Camp"], 439 | 5443 : [17024, 7984, 17072, 8032, "Dreadwatch Outpost"], 440 | 5654 : [18784, 11200, 18880, 11264, "Chiselgrip"], 441 | 811 : [17312, 6384, 17408, 6400, "Nightmare Vale"], 442 | 4915 : [17216, 6496, 17328, 6624, "Scarlet Camp"], 443 | 103 : [18192, 13568, 18320, 13728, "Ruins of Zul'Mamwe"], 444 | 5488 : [20608, 9200, 20720, 9312, "Gorshak War Camp"], 445 | 143 : [19696, 9696, 19840, 9904, "Mo'grosh Stronghold"], 446 | 1917 : [19968, 7328, 20064, 7408, "Shaol'watha"], 447 | 2623 : [19872, 6368, 19968, 6400, "The Infectis Scar"], 448 | 2263 : [19648, 6480, 19712, 6576, "Crown Guard Tower"], 449 | 2262 : [19584, 6608, 19712, 6656, "Darrowshire"], 450 | 226 : [16928, 6768, 17024, 6896, "The Skittering Dark"], 451 | 1778 : [19856, 12288, 19968, 12544, "Sorrowmurk"], 452 | 74 : [19664, 12320, 19824, 12528, "Pool of Tears"], 453 | 333 : [19424, 7760, 19456, 7856, "Circle of East Binding"], 454 | 144 : [19312, 9936, 19376, 10096, "Thelsamar"], 455 | 159 : [17664, 6240, 17824, 6384, "Brill"], 456 | 166 : [17568, 6368, 17680, 6448, "Cold Hearth Manor"], 457 | 807 : [18864, 9920, 19008, 10064, "North Gate Pass"], 458 | 5114 : [18832, 10064, 18848, 10080, "Bahrum's Post"], 459 | 212 : [18768, 10080, 18976, 10224, "Helm's Bed Lake"], 460 | 5480 : [17216, 7744, 17312, 7840, "Gilneas Liberation Front Base Camp"], 461 | 856 : [18032, 12336, 18160, 12544, "Twilight Grove"], 462 | 797 : [17936, 12144, 17968, 12256, "Jerod's Landing"], 463 | 1897 : [19408, 10304, 19456, 10432, "The Maker's Terrace"], 464 | 341 : [19632, 10400, 19760, 10464, "Camp Kosh"], 465 | 338 : [19376, 10448, 19472, 10576, "Angor Fortress"], 466 | 346 : [19504, 10464, 19600, 10560, "Hammertoe's Digsite"], 467 | 3317 : [20048, 7648, 20208, 7760, "Revantusk Village"], 468 | 2270 : [20432, 6016, 20800, 6144, "The Noxious Glade"], 469 | 810 : [17472, 6304, 17568, 6400, "Stillwater Pond"], 470 | 4921 : [17504, 6512, 17648, 6592, "Scarlet Watchtower"], 471 | 924 : [19056, 10144, 19248, 10240, "Valley of Kings"], 472 | 923 : [19216, 10160, 19360, 10240, "Stonesplinter Valley"], 473 | 4544 : [20496, 6176, 20672, 6368, "Death's Breach"], 474 | 2268 : [20416, 6240, 20480, 6400, "Light's Hope Chapel"], 475 | 5428 : [17696, 11344, 17744, 11392, "The Eastern Earthshrine"], 476 | 1797 : [19680, 12544, 19760, 12752, "Stagalbog"], 477 | 1457 : [19424, 12624, 19456, 12672, "Nethergarde Mines"], 478 | 1438 : [19376, 12624, 19424, 12768, "Nethergarde Keep"], 479 | 5076 : [19376, 12640, 19456, 12752, "Nethergarde Supply Camps"], 480 | 313 : [18832, 7696, 18944, 7888, "Northfold Manor"], 481 | 4916 : [17408, 6320, 17472, 6384, "Calston Estate"], 482 | 91 : [18192, 11936, 18320, 12032, "Tower of Azora"], 483 | 62 : [18240, 12048, 18432, 12208, "Brackwell Pumpkin Patch"], 484 | 275 : [18464, 7504, 18688, 7680, "Durnholde Keep"], 485 | 334 : [18720, 7776, 18800, 7888, "Circle of West Binding"], 486 | 5121 : [18672, 7856, 18688, 7904, "Galen's Fall"], 487 | 5629 : [18784, 10704, 18832, 10752, "Thorium Advance"], 488 | 306 : [16880, 7264, 17040, 7424, "South Tide's Run"], 489 | 227 : [17280, 6928, 17424, 7008, "Valgan's Field"], 490 | 237 : [17296, 7008, 17424, 7152, "The Decrepit Fields"], 491 | 155 : [17008, 6400, 17088, 6480, "Night Web's Hollow"], 492 | 4963 : [15632, 10352, 15872, 10496, "Glimmerdeep Gorge"], 493 | 5652 : [18576, 11264, 18688, 11440, "Black Tooth Hovel"], 494 | 2563 : [18768, 12704, 18816, 12768, "Morgan's Plot"], 495 | 345 : [19472, 10752, 19536, 10832, "Agmond's End"], 496 | 3197 : [18576, 6944, 18672, 7008, "Chillwind Camp"], 497 | 5392 : [18528, 6512, 18592, 6560, "Charred Outpost"], 498 | 199 : [18448, 6528, 18512, 6624, "Felstone Field"], 499 | 921 : [16992, 12704, 17120, 12800, "Demont's Place"], 500 | 115 : [16912, 12864, 17040, 12960, "Westfall Lighthouse"], 501 | 2517 : [19232, 12736, 19360, 12800, "Rise of the Defiler"], 502 | 5086 : [19200, 12880, 19232, 12912, "Dreadmaul Furnace"], 503 | 1439 : [19248, 12896, 19312, 12992, "Dreadmaul Post"], 504 | 5387 : [17248, 7424, 17360, 7664, "The Forsaken Front"], 505 | 236 : [17072, 7472, 17152, 7568, "Shadowfang Keep"], 506 | 204 : [17120, 7568, 17152, 7648, "Pyrewood Village"], 507 | 5477 : [17168, 7584, 17184, 7600, "Pyrewood Inn"], 508 | 5476 : [17184, 7600, 17200, 7616, "Pyrewood Chapel"], 509 | 98 : [18848, 11712, 18896, 11776, "Rethban Caverns"], 510 | 37 : [18048, 13072, 18128, 13248, "Lake Nazferiti"], 511 | 1760 : [18128, 13136, 18160, 13184, "Venture Co. Operations Center"], 512 | 231 : [17440, 7568, 17552, 7664, "Beren's Peril"], 513 | 161 : [18224, 5984, 18256, 6064, "Terrace of Repose"], 514 | 160 : [18240, 6048, 18304, 6112, "Whispering Gardens"], 515 | 812 : [18240, 6096, 18496, 6144, "Venomweb Vale"], 516 | 1037 : [19488, 9312, 19600, 9536, "Grim Batol"], 517 | 1018 : [18432, 9040, 18640, 9216, "Black Channel Marsh"], 518 | 4968 : [15328, 10880, 15360, 10976, "Quel'Dormir Terrace"], 519 | 5054 : [16240, 9744, 16384, 9856, "The Accursed Reef"], 520 | 5030 : [16080, 9728, 16128, 9792, "Shallow's End"], 521 | 5053 : [16144, 9776, 16240, 9904, "Gurboggle's Ledge"], 522 | 5055 : [16240, 9840, 16384, 9920, "Gnaws' Boneyard"], 523 | 1978 : [19856, 12608, 19888, 12672, "Misty Reed Post"], 524 | 5448 : [20016, 6304, 20096, 6384, "Light's Shield Tower"], 525 | 2264 : [20016, 6336, 20128, 6528, "Corin's Crossing"], 526 | 1039 : [18320, 8720, 18384, 8912, "The Lost Fleet"], 527 | 5304 : [18608, 8784, 18656, 8816, "Swiftgear Station"], 528 | 309 : [18928, 8704, 19024, 8864, "Ironbeard's Tomb"], 529 | 5478 : [17136, 7600, 17152, 7616, "Pyrewood Town Hall"], 530 | 917 : [17440, 12544, 17536, 12656, "The Dead Acre"], 531 | 880 : [19056, 8496, 19152, 8560, "Thandol Span"], 532 | 881 : [19056, 8560, 19152, 8640, "Thandol Span"], 533 | 205 : [18992, 8640, 19152, 8736, "Dun Modr"], 534 | 5464 : [19712, 6672, 19824, 6800, "Darrowshire Hunting Grounds"], 535 | 813 : [18304, 6560, 18336, 6640, "The Bulwark"], 536 | 2622 : [20288, 6288, 20416, 6400, "Pestilent Scar"], 537 | 229 : [17120, 7232, 17264, 7392, "Olsen's Farthing"], 538 | 2269 : [20352, 6144, 20432, 6288, "Browman Mill"], 539 | 1002 : [18736, 11952, 18928, 12032, "Three Corners"], 540 | 1738 : [17696, 14016, 17760, 14112, "Nek'mani Wellspring"], 541 | 1683 : [17936, 7248, 18096, 7392, "Growless Cave"], 542 | 1677 : [17920, 7376, 17984, 7504, "Gavin's Naze"], 543 | 1680 : [18016, 7392, 18096, 7568, "The Headland"], 544 | 113 : [16960, 12368, 17040, 12464, "Gold Coast Quarry"], 545 | 5082 : [19552, 13216, 19600, 13264, "Bloodwash Cavern"], 546 | 2272 : [20224, 5888, 20432, 6080, "Northdale"], 547 | 156 : [17200, 6272, 17376, 6352, "Solliden Farmstead"], 548 | 4918 : [18304, 6160, 18384, 6240, "Scarlet Encampment"], 549 | 117 : [17760, 13328, 17872, 13424, "Grom'gol Base Camp"], 550 | 312 : [17536, 14192, 17568, 14272, "Janeiro's Point"], 551 | 192 : [18560, 6144, 18784, 6336, "Northridge Lumber Camp"], 552 | 190 : [18528, 5904, 18688, 6128, "Hearthglen"], 553 | 5422 : [18832, 6112, 18880, 6144, "Taelan's Tower"], 554 | 5369 : [17360, 6704, 17472, 6800, "Forsaken High Command"], 555 | 239 : [17264, 6752, 17344, 6864, "The Ivar Patch"], 556 | 122 : [17424, 12976, 17552, 13120, "Zuuldaia Ruins"], 557 | 5460 : [19488, 12288, 19664, 12464, "The Bloodmire"], 558 | 808 : [18864, 9744, 18944, 9920, "North Gate Outpost"], 559 | 5458 : [19760, 12080, 19808, 12144, "Bogpaddle"], 560 | 5650 : [18352, 11344, 18432, 11488, "The Whelping Downs"], 561 | 1442 : [18256, 10496, 18320, 10720, "Firewatch Ridge"], 562 | 5485 : [20224, 9312, 20288, 9472, "Dunwald Hovel"], 563 | 5627 : [20240, 9472, 20368, 9552, "Black Drake Roost"], 564 | 5489 : [20288, 9376, 20448, 9472, "The Boneyard"], 565 | 5484 : [20240, 9552, 20304, 9600, "Dunwald Holdout"], 566 | 5487 : [20224, 9632, 20320, 9728, "Dunwald Market Row"], 567 | 5486 : [20320, 9632, 20384, 9696, "Dunwald Town Square"], 568 | 1879 : [18960, 10752, 19104, 10832, "Mirage Flats"], 569 | 5564 : [19104, 10752, 19184, 10832, "Dragon's Mouth"], 570 | 344 : [18960, 10832, 19120, 11008, "Camp Cagg"], 571 | 347 : [18976, 10896, 19056, 10976, "Dustbelch Grotto"], 572 | 101 : [18176, 12896, 18256, 13040, "Kurzen's Compound"], 573 | 4919 : [17856, 6432, 17920, 6464, "Death's Watch Waystation"], 574 | 5493 : [20480, 9232, 20560, 9424, "The Great Sunder"], 575 | 5141 : [20560, 9392, 20656, 9472, "Firebeard's Patrol"], 576 | 5611 : [20512, 9424, 20560, 9456, "Firebeard Abbey"], 577 | 5442 : [17408, 7984, 17440, 8016, "Emberstone Mine"], 578 | 5470 : [20160, 9408, 20224, 9472, "Victory Point"], 579 | 1016 : [19200, 8704, 19424, 8960, "Direforge Hill"], 580 | 5519 : [19776, 10768, 19824, 10816, "Rhea's Camp"], 581 | 806 : [19008, 10000, 19104, 10160, "South Gate Outpost"], 582 | 805 : [19008, 10080, 19040, 10176, "South Gate Pass"], 583 | 839 : [19104, 10096, 19152, 10176, "South Gate Pass"], 584 | 109 : [17264, 12080, 17312, 12256, "Furlbrow's Pumpkin Farm"], 585 | 111 : [17152, 12096, 17280, 12240, "Jangolode Mine"], 586 | 1884 : [19456, 7168, 19504, 7296, "Agol'watha"], 587 | 1886 : [19536, 7328, 19632, 7408, "The Creeping Ruin"], 588 | 2419 : [19328, 11040, 19408, 11136, "Slither Rock"], 589 | 809 : [18256, 9808, 18352, 9920, "Gates of Ironforge"], 590 | 5148 : [17584, 11616, 17648, 11696, "Trade District"], 591 | 5154 : [17440, 11680, 17536, 11760, "Mage Quarter"], 592 | 5527 : [20352, 9392, 20416, 9456, "Crucible of Carnage"], 593 | 241 : [18272, 12624, 18416, 12768, "The Rotting Orchard"], 594 | 798 : [18512, 12064, 18624, 12176, "Ridgepoint Tower"], 595 | 1881 : [19136, 7280, 19200, 7344, "Shindigger's Camp"], 596 | 5651 : [18384, 11280, 18432, 11328, "Singestar Post"], 597 | 4837 : [17632, 10464, 17664, 10496, "Whitebeard's Encampment"], 598 | 5080 : [19632, 13328, 19680, 13408, "Bloodwash Fighting Pits"], 599 | 5081 : [19520, 13360, 19584, 13424, "Bloodwash Shrine"], 600 | 5525 : [19520, 10560, 19584, 10624, "Dustwind Dig"], 601 | 5526 : [19552, 10640, 19584, 10736, "Tomb of the Watchers"], 602 | 5524 : [19584, 10720, 19616, 10752, "Bloodwatcher Point"], 603 | 0 : {} 604 | }; 605 | --------------------------------------------------------------------------------