├── .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 | $list = glob("mpqs/*.MPQ");
3 |
4 | foreach ($list as $mpq){
5 | list($folder, $file) = explode('/', $mpq);
6 | list($base, $ext) = explode('.', $file);
7 | $cmd = "/root/git-projects/MPQExtractor/build/bin/MPQExtractor -l lists/$base.txt $mpq";
8 | passthru($cmd);
9 | }
10 |
--------------------------------------------------------------------------------
/install.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # neuron-base puts it in the wrong place, because the repo-name does is not the web domain
4 | mv /var/www/html/World-of-MapCraft /var/www/html/worldofmapcraft.com
5 |
6 | ln -s /var/www/html/worldofmapcraft.com/site.conf /etc/apache2/sites-available/worldofmapcraft.com.conf
7 | a2ensite worldofmapcraft.com
8 |
9 | service apache2 reload
10 |
11 |
--------------------------------------------------------------------------------
/notes.txt:
--------------------------------------------------------------------------------
1 | everything:
2 | http://www4.picturepush.com/photo/a/8433147/img/Map/AzerothFull-copy.jpg
3 |
4 | in-game mop world:
5 | http://images2.wikia.nocookie.net/__cb20120601175439/wowwiki/images/thumb/b/b6/WorldMapBeta-World.jpg/830px-WorldMapBeta-World.jpg
6 |
7 |
8 | calculating zone labels:
9 | * http://www.wowhead.com/forums&topic=11405/suggestion-sub-zones#p302654
10 |
--------------------------------------------------------------------------------
/ssl.conf:
--------------------------------------------------------------------------------
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 |
2 |
3 | $areas = parse_dbc('AreaTable.dbc', array(12), 1);
4 |
5 | $children = array();
6 | foreach ($areas as $row){
7 | if ($row[3]) $children[$row[3]][$row[1]] = 1;
8 | }
9 |
10 | foreach ($areas as $k => $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 |
2 | extract_mogi('LavaDungeon.wmo');
3 | exit;
4 |
5 | if (0){
6 | echo "root: ".extract_root_id('LavaDungeon.wmo')."\n";
7 | echo "000 : ".extract_group_id('LavaDungeon_000.wmo')."\n";
8 | echo "001 : ".extract_group_id('LavaDungeon_001.wmo')."\n";
9 | echo "002 : ".extract_group_id('LavaDungeon_002.wmo')."\n";
10 | echo "003 : ".extract_group_id('LavaDungeon_003.wmo')."\n";
11 | echo "004 : ".extract_group_id('LavaDungeon_004.wmo')."\n";
12 | echo "005 : ".extract_group_id('LavaDungeon_005.wmo')."\n";
13 | echo "006 : ".extract_group_id('LavaDungeon_006.wmo')."\n";
14 | echo "007 : ".extract_group_id('LavaDungeon_007.wmo')."\n";
15 | echo "008 : ".extract_group_id('LavaDungeon_008.wmo')."\n";
16 | echo "009 : ".extract_group_id('LavaDungeon_009.wmo')."\n";
17 | echo "010 : ".extract_group_id('LavaDungeon_010.wmo')."\n";
18 | echo "011 : ".extract_group_id('LavaDungeon_011.wmo')."\n";
19 | ecit;
20 | }
21 |
22 | #$fh = fopen('LavaDungeon_000.wmo', 'r');
23 | #seek_to_chunk($fh, 'MOGP');
24 |
25 |
26 | $fh = fopen('LavaDungeon.wmo', 'r');
27 | seek_to_chunk($fh, 'MOHD');
28 |
29 | fseek($fh, 4, SEEK_CUR);
30 | $groups = read_int($fh);
31 | $portals = read_int($fh);
32 | echo "p: $portals\n";
33 | exit;
34 |
35 |
36 |
37 | #$fh = fopen('LavaDungeon_000.wmo', 'r');
38 | #seek_to_chunk($fh, 'MOGP');
39 | #fseek($fh, 0x44, SEEK_CUR);
40 | #chunk_map($fh, 0);
41 | #exit;
42 |
43 | $fh = fopen('LavaDungeon.wmo', 'r');
44 | chunk_map($fh);
45 | #seek_to_chunk($fh, 'MOGN');
46 | #$data = fread($fh, 204);
47 | #echo str_replace("\0","\n",$data)."\n";
48 | exit;
49 |
50 |
51 | # $fh = fopen('OrgrimmarInstance.wdt', 'r');
52 | #chunk_map($fh);
53 |
54 | #seek_to_chunk($fh, 'MAOF');
55 | #$data = fread($fh, 4096*4);
56 | #echo urlencode($data);
57 | #exit;
58 |
59 |
60 |
61 | extract_mogi('LavaDungeon.wmo' );
62 |
63 | $fh = fopen('LavaDungeon.wmo', 'r');
64 | chunk_map($fh);
65 |
66 | echo extract_pos('LavaDungeon_000.wmo')."\n";
67 | echo extract_pos('LavaDungeon_001.wmo')."\n";
68 | echo extract_pos('LavaDungeon_002.wmo')."\n";
69 | echo extract_pos('LavaDungeon_011.wmo')."\n";
70 |
71 |
72 | #chunk_map($fh);
73 |
74 |
75 |
76 | function extract_pos($name){
77 |
78 | $fh = fopen($name, 'r');
79 | fseek($fh, 24);
80 | $floats = fread($fh, 24);
81 | $box = unpack('f6', $floats);
82 |
83 | $x1 = $box[1];
84 | $y1 = $box[3];
85 |
86 | $x2 = $box[4];
87 | $y2 = $box[6];
88 |
89 | return "$x1,$y1 -> $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 |
212 |
213 |

214 |
215 |
216 | function nav_link($k, $v){
217 | global $map;
218 | $v = str_replace(array_keys($GLOBALS['logo_map']), $GLOBALS['logo_map'], $v);
219 | $url = $k == '_' ? '/' : "/$k/";
220 | if ($k == $map){
221 | return "
$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 |
243 | - =nav_link('_', 'Azeroth')?>
244 | - =nav_link('outland', 'Outland')?>
245 | - =nav_link('vashjir', 'Vash\'jir')?>
246 | - =nav_link('deepholm', 'Deepholm')?>
247 | - PvP
248 |
249 | - Battlegrounds
250 |
251 | - =nav_link('warsong-gulch', 'Warsong Gulch')?>
252 | - =nav_link('arathi-basin', 'Arathi Basin')?>
253 | - =nav_link('alterac-valley', 'Alterac Valley')?>
254 | - =nav_link('eye-of-the-storm', 'Eye of the Storm {BC}')?>
255 | - =nav_link('strand-of-the-ancients', 'Strand of the Ancients {Wrath}')?>
256 | - =nav_link('isle-of-conquest', 'Isle of Conquest {Wrath}')?>
257 | - =nav_link('battle-for-gilneas', 'Battle for Gilneas {Cata}')?>
258 | - =nav_link('twin-peaks', 'Twin Peaks {Cata}')?>
259 | - =dead_link("Silver Shard Mine {MoP}")?>
260 | - =dead_link("Temple of Kotmogu {MoP}")?>
261 | - =dead_link("Unnamed CTF {MoP}")?>
262 |
263 |
264 | - Arenas
265 |
266 | - =dead_link("The Ring of Valor {BC}")?>
267 | - =dead_link("The Ruins of Lordaeron {BC}")?>
268 | - =dead_link("The Ring of Trials {BC}")?>
269 | - =dead_link("The Circle of Blood {BC}")?>
270 | - =dead_link("The Dalaran Arena {Wrath}")?>
271 | - =dead_link("Tol'vir Proving Grounds {MoP}")?>
272 |
273 |
274 |
275 |
276 | - Dungeons
277 |
278 | - Classic
279 |
280 | - =nav_link('ragefire-chasm', "Ragefire Chasm")?>
281 | - =nav_link('deadmines', "Deadmines")?>
282 | - =nav_link('wailing-caverns', "Wailing Caverns")?>
283 | - =nav_link('shadowfang-keep', "Shadowfang Keep")?>
284 | - =nav_link('blackfathom-deeps', "Blackfathom Deeps")?>
285 | - =nav_link('stockade', "The Stockade")?>
286 | - =nav_link('gnomeregan', "Gnomeregan")?>
287 | - =nav_link('scarlet-monastery', "Scarlet Monastery")?>
288 | - =nav_link('razorfen-kraul', "Razorfen Kraul")?>
289 | - =nav_link('maraudon', "Maraudon")?>
290 | - =nav_link('uldaman', "Uldaman")?>
291 | - =nav_link('dire-maul', "Dire Maul")?>
292 | - =nav_link('scholomance', "Scholomance")?>
293 | - =nav_link('razorfen-downs', "Razorfen Downs")?>
294 | - =nav_link('stratholme', "Stratholme")?>
295 | - =nav_link('zul-farrak', "Zul'Farrak")?>
296 | - =nav_link('blackrock-depths', "Blackrock Depths")?>
297 | - =nav_link('sunken-temple', "Temple of Atal'Hakkar")?>
298 | - =nav_link('lower-blackrock-spire', "Lower Blackrock Spire")?>
299 | - =nav_link('upper-blackrock-spire', "Upper Blackrock Spire")?>
300 |
301 |
302 | - The Burning Crusade
303 |
304 | - =nav_link('hellfire-ramparts', "Hellfire Ramparts")?>
305 | - =nav_link('blood-furnace', "The Blood Furnace")?>
306 | - =nav_link('shattered-halls', "Shattered Halls")?>
307 | - =nav_link('slave-pens', "Slave Pens")?>
308 | - =nav_link('underbog', "The Underbog")?>
309 | - =nav_link('steamvault', "The Steamvault")?>
310 | - =nav_link('mana-tombs', "Mana-Tombs")?>
311 | - =nav_link('auchenai-crypts', "Auchenai Crypts")?>
312 | - =nav_link('sethekk-halls', "Sethekk Halls")?>
313 | - =nav_link('shadow-labyrinth', "Shadow Labyrinth")?>
314 | - =nav_link('durnholde-keep', "Durnholde Keep")?>
315 | - =nav_link('black-morass', "Black Morass")?>
316 | - =nav_link('mechanar', "The Mechanar")?>
317 | - =nav_link('botanica', "The Botanica")?>
318 | - =nav_link('arcatraz', "The Arcatraz")?>
319 | - =nav_link('magisters-terrace', "Magisters' Terrace")?>
320 |
321 |
322 | - Wrath of the Lich King
323 |
324 | - =nav_link('utgarde-keep', "Utgarde Keep")?>
325 | - =nav_link('nexus', "The Nexus")?>
326 | - =nav_link('old-kingdom', "Ahn'kahet: The Old Kingdom")?>
327 | - =nav_link('azjol-nerub', "Azjol-Nerub")?>
328 | - =nav_link('drak-tharon-keep', "Drak'Tharon Keep")?>
329 | - =nav_link('violet-hold', "The Violet Hold")?>
330 | - =nav_link('gundrak', "Gundrak")?>
331 | - =nav_link('halls-of-stone', "Halls of Stone")?>
332 | - =nav_link('halls-of-lightning', "Halls of Lightning")?>
333 | - =nav_link('oculus', "The Oculus")?>
334 | - =nav_link('culling-of-stratholme', "Culling of Stratholme")?>
335 | - =nav_link('utgarde-pinnacle', "Utgarde Pinnacle")?>
336 | - =nav_link('trial-of-the-champion', "Trial of the Champion")?>
337 | - =nav_link('forge-of-souls', "Forge of Souls")?>
338 | - =nav_link('pit-of-saron', "Pit of Saron")?>
339 | - =nav_link('halls-of-reflection', "Halls of Reflection")?>
340 |
341 |
342 | - Cataclysm
343 |
344 | - =nav_link('throne-of-the-tides', "Throne of the Tides")?>
345 | - =nav_link('blackrock-caverns', "Blackrock Caverns")?>
346 | - =nav_link('stonecore', "The Stonecore")?>
347 | - =nav_link('vortex-pinnacle', "Vortex Pinnacle")?>
348 | - =nav_link('lost-city', "Lost City of the Tol'vir")?>
349 | - =nav_link('halls-of-origination', "Halls of Origination")?>
350 | - =nav_link('grim-batol', "Grim Batol")?>
351 | - =nav_link('zul-aman', "Zul'Aman")?>
352 | - =nav_link('zul-gurub', "Zul'Gurub")?>
353 | - =nav_link('end-time', "End Time")?>
354 | - =nav_link('well-of-eternity', "Well of Eternity")?>
355 | - =nav_link('hour-of-twilight', "Hour of Twilight")?>
356 |
357 |
358 | - Mists of Pandaria
359 |
360 | - =dead_link("Temple of the Jade Serpent")?>
361 | - =dead_link("Stormstout Brewery")?>
362 | - =dead_link("Shado-pan Monastery")?>
363 | - =dead_link("Gate of the Setting Sun")?>
364 | - =dead_link("Mogu'Shan Palace")?>
365 | - =dead_link("The Perfect Storm")?>
366 | - =dead_link("Crypt of Forgotten Kings")?>
367 | - =dead_link("Temple of the Red Crane")?>
368 | - =dead_link("Temple of the White Tiger")?>
369 | - =dead_link("Scholomance (90)")?>
370 | - =dead_link("Scarlet Cathedral")?>
371 | - =dead_link("Scarlet Halls")?>
372 |
373 |
374 |
375 |
376 | - Raids
377 |
378 | - Classic
379 |
380 | - =nav_link('molten-core', "Molten Core")?>
381 | - =nav_link('blackwing-lair', "Blackwing Lair")?>
382 | - =nav_link('aq-ruins', "Ruins of Ahn'Qiraj")?>
383 | - =nav_link('aq-temple', "Temple of Ahn'Qiraj")?>
384 |
385 |
386 | - The Burning Crusade
387 |
388 | - =nav_link('karazhan', "Karazhan")?>
389 | - =nav_link('gruul', "Gruul's Lair")?>
390 | - =nav_link('magtheridon', "Magtheridon's Lair")?>
391 | - =nav_link('serpentshrine-cavern', "Serpentshrine Cavern")?>
392 | - =nav_link('the-eye', "The Eye")?>
393 | - =nav_link('mount-hyjal', "Battle for Mount Hyjal")?>
394 | - =nav_link('black-temple', "Black Temple")?>
395 | - =nav_link('sunwell', "Sunwell Plateau")?>
396 |
397 |
398 | - Wrath of the Lich King
399 |
400 | - =nav_link('naxxramas', "Naxxramas")?>
401 | - =nav_link('obsidian-sanctum', "Obsidian Sanctum")?>
402 | - =nav_link('vault-of-archavon', "Vault of Archavon")?>
403 | - =nav_link('eye-of-eternity', "The Eye of Eternity")?>
404 | - =nav_link('ulduar', "Ulduar")?>
405 | - =nav_link('trial-of-the-crusader', "Trial of the Crusader")?>
406 | - =nav_link('onyxia', "Onyxia's Lair")?>
407 | - =nav_link('ruby-sanctum', "Ruby Sanctum")?>
408 | - =nav_link('icecrown-citadel', "Icecrown Citadel")?>
409 |
410 |
411 | - Cataclysm
412 |
413 | - =nav_link('baradin-hold', "Baradin Hold")?>
414 | - =nav_link('bastion-of-twilight', "Bastion of Twilight")?>
415 | - =nav_link('throne-of-four-winds', "Throne of the Four Winds")?>
416 | - =nav_link('blackwing-descent', "Blackwing Descent")?>
417 | - =nav_link('firelands', "Firelands")?>
418 | - =nav_link('dragon-soul', "Dragon Soul")?>
419 |
420 |
421 | - Mists of Pandaria
422 |
423 | - =dead_link("Mogu'shan Vaults")?>
424 | - =dead_link("Heart of Fear")?>
425 | - =dead_link("Terrace of Endless Spring")?>
426 |
427 |
428 |
429 |
430 | - Misc
431 |
432 | - =nav_link('undercity', 'Undercity')?>
433 | - =nav_link('ironforge', 'Ironforge')?>
434 | - =nav_link('exodar', 'The Exodar')?>
435 | - =nav_link('subway', 'SW / IF Subway')?>
436 | - =nav_link('caverns-of-time', 'Caverns of Time')?>
437 | - =nav_link('dalaran', 'Dalaran')?>
438 | - =nav_link('darkmoon-faire', 'Darkmoon Faire Isle')?>
439 | - =nav_link('firelands-dailies', 'Firelands Dailies')?>
440 | - =dead_link("The Wandering Isle")?>
441 |
442 |
443 |
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 |
212 |
213 |

214 |
215 |
216 | function nav_link($k, $v){
217 | global $map;
218 | $v = str_replace(array_keys($GLOBALS['logo_map']), $GLOBALS['logo_map'], $v);
219 | $url = $k == '_' ? '/' : "/$k/";
220 | if ($k == $map){
221 | return "
$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 |
243 | - =nav_link('_', 'Azeroth')?>
244 | - =nav_link('outland', 'Outland')?>
245 | - =nav_link('vashjir', 'Vash\'jir')?>
246 | - =nav_link('deepholm', 'Deepholm')?>
247 | - PvP
248 |
249 | - Battlegrounds
250 |
251 | - =nav_link('warsong-gulch', 'Warsong Gulch')?>
252 | - =nav_link('arathi-basin', 'Arathi Basin')?>
253 | - =nav_link('alterac-valley', 'Alterac Valley')?>
254 | - =nav_link('eye-of-the-storm', 'Eye of the Storm {BC}')?>
255 | - =nav_link('strand-of-the-ancients', 'Strand of the Ancients {Wrath}')?>
256 | - =nav_link('isle-of-conquest', 'Isle of Conquest {Wrath}')?>
257 | - =nav_link('battle-for-gilneas', 'Battle for Gilneas {Cata}')?>
258 | - =nav_link('twin-peaks', 'Twin Peaks {Cata}')?>
259 | - =dead_link("Silver Shard Mine {MoP}")?>
260 | - =dead_link("Temple of Kotmogu {MoP}")?>
261 | - =dead_link("Unnamed CTF {MoP}")?>
262 |
263 |
264 | - Arenas
265 |
266 | - =dead_link("The Ring of Valor {BC}")?>
267 | - =dead_link("The Ruins of Lordaeron {BC}")?>
268 | - =dead_link("The Ring of Trials {BC}")?>
269 | - =dead_link("The Circle of Blood {BC}")?>
270 | - =dead_link("The Dalaran Arena {Wrath}")?>
271 | - =dead_link("Tol'vir Proving Grounds {MoP}")?>
272 |
273 |
274 |
275 |
276 | - Dungeons
277 |
278 | - Classic
279 |
280 | - =nav_link('ragefire-chasm', "Ragefire Chasm")?>
281 | - =nav_link('deadmines', "Deadmines")?>
282 | - =nav_link('wailing-caverns', "Wailing Caverns")?>
283 | - =nav_link('shadowfang-keep', "Shadowfang Keep")?>
284 | - =nav_link('blackfathom-deeps', "Blackfathom Deeps")?>
285 | - =nav_link('stockade', "The Stockade")?>
286 | - =nav_link('gnomeregan', "Gnomeregan")?>
287 | - =nav_link('scarlet-monastery', "Scarlet Monastery")?>
288 | - =nav_link('razorfen-kraul', "Razorfen Kraul")?>
289 | - =nav_link('maraudon', "Maraudon")?>
290 | - =nav_link('uldaman', "Uldaman")?>
291 | - =nav_link('dire-maul', "Dire Maul")?>
292 | - =nav_link('scholomance', "Scholomance")?>
293 | - =nav_link('razorfen-downs', "Razorfen Downs")?>
294 | - =nav_link('stratholme', "Stratholme")?>
295 | - =nav_link('zul-farrak', "Zul'Farrak")?>
296 | - =nav_link('blackrock-depths', "Blackrock Depths")?>
297 | - =nav_link('sunken-temple', "Temple of Atal'Hakkar")?>
298 | - =nav_link('lower-blackrock-spire', "Lower Blackrock Spire")?>
299 | - =nav_link('upper-blackrock-spire', "Upper Blackrock Spire")?>
300 |
301 |
302 | - The Burning Crusade
303 |
304 | - =nav_link('hellfire-ramparts', "Hellfire Ramparts")?>
305 | - =nav_link('blood-furnace', "The Blood Furnace")?>
306 | - =nav_link('shattered-halls', "Shattered Halls")?>
307 | - =nav_link('slave-pens', "Slave Pens")?>
308 | - =nav_link('underbog', "The Underbog")?>
309 | - =nav_link('steamvault', "The Steamvault")?>
310 | - =nav_link('mana-tombs', "Mana-Tombs")?>
311 | - =nav_link('auchenai-crypts', "Auchenai Crypts")?>
312 | - =nav_link('sethekk-halls', "Sethekk Halls")?>
313 | - =nav_link('shadow-labyrinth', "Shadow Labyrinth")?>
314 | - =nav_link('durnholde-keep', "Durnholde Keep")?>
315 | - =nav_link('black-morass', "Black Morass")?>
316 | - =nav_link('mechanar', "The Mechanar")?>
317 | - =nav_link('botanica', "The Botanica")?>
318 | - =nav_link('arcatraz', "The Arcatraz")?>
319 | - =nav_link('magisters-terrace', "Magisters' Terrace")?>
320 |
321 |
322 | - Wrath of the Lich King
323 |
324 | - =nav_link('utgarde-keep', "Utgarde Keep")?>
325 | - =nav_link('nexus', "The Nexus")?>
326 | - =nav_link('old-kingdom', "Ahn'kahet: The Old Kingdom")?>
327 | - =nav_link('azjol-nerub', "Azjol-Nerub")?>
328 | - =nav_link('drak-tharon-keep', "Drak'Tharon Keep")?>
329 | - =nav_link('violet-hold', "The Violet Hold")?>
330 | - =nav_link('gundrak', "Gundrak")?>
331 | - =nav_link('halls-of-stone', "Halls of Stone")?>
332 | - =nav_link('halls-of-lightning', "Halls of Lightning")?>
333 | - =nav_link('oculus', "The Oculus")?>
334 | - =nav_link('culling-of-stratholme', "Culling of Stratholme")?>
335 | - =nav_link('utgarde-pinnacle', "Utgarde Pinnacle")?>
336 | - =nav_link('trial-of-the-champion', "Trial of the Champion")?>
337 | - =nav_link('forge-of-souls', "Forge of Souls")?>
338 | - =nav_link('pit-of-saron', "Pit of Saron")?>
339 | - =nav_link('halls-of-reflection', "Halls of Reflection")?>
340 |
341 |
342 | - Cataclysm
343 |
344 | - =nav_link('throne-of-the-tides', "Throne of the Tides")?>
345 | - =nav_link('blackrock-caverns', "Blackrock Caverns")?>
346 | - =nav_link('stonecore', "The Stonecore")?>
347 | - =nav_link('vortex-pinnacle', "Vortex Pinnacle")?>
348 | - =nav_link('lost-city', "Lost City of the Tol'vir")?>
349 | - =nav_link('halls-of-origination', "Halls of Origination")?>
350 | - =nav_link('grim-batol', "Grim Batol")?>
351 | - =nav_link('zul-aman', "Zul'Aman")?>
352 | - =nav_link('zul-gurub', "Zul'Gurub")?>
353 | - =nav_link('end-time', "End Time")?>
354 | - =nav_link('well-of-eternity', "Well of Eternity")?>
355 | - =nav_link('hour-of-twilight', "Hour of Twilight")?>
356 |
357 |
358 | - Mists of Pandaria
359 |
360 | - =dead_link("Temple of the Jade Serpent")?>
361 | - =dead_link("Stormstout Brewery")?>
362 | - =dead_link("Shado-pan Monastery")?>
363 | - =dead_link("Gate of the Setting Sun")?>
364 | - =dead_link("Mogu'Shan Palace")?>
365 | - =dead_link("The Perfect Storm")?>
366 | - =dead_link("Crypt of Forgotten Kings")?>
367 | - =dead_link("Temple of the Red Crane")?>
368 | - =dead_link("Temple of the White Tiger")?>
369 | - =dead_link("Scholomance (90)")?>
370 | - =dead_link("Scarlet Cathedral")?>
371 | - =dead_link("Scarlet Halls")?>
372 |
373 |
374 |
375 |
376 | - Raids
377 |
378 | - Classic
379 |
380 | - =nav_link('molten-core', "Molten Core")?>
381 | - =nav_link('blackwing-lair', "Blackwing Lair")?>
382 | - =nav_link('aq-ruins', "Ruins of Ahn'Qiraj")?>
383 | - =nav_link('aq-temple', "Temple of Ahn'Qiraj")?>
384 |
385 |
386 | - The Burning Crusade
387 |
388 | - =nav_link('karazhan', "Karazhan")?>
389 | - =nav_link('gruul', "Gruul's Lair")?>
390 | - =nav_link('magtheridon', "Magtheridon's Lair")?>
391 | - =nav_link('serpentshrine-cavern', "Serpentshrine Cavern")?>
392 | - =nav_link('the-eye', "The Eye")?>
393 | - =nav_link('mount-hyjal', "Battle for Mount Hyjal")?>
394 | - =nav_link('black-temple', "Black Temple")?>
395 | - =nav_link('sunwell', "Sunwell Plateau")?>
396 |
397 |
398 | - Wrath of the Lich King
399 |
400 | - =nav_link('naxxramas', "Naxxramas")?>
401 | - =nav_link('obsidian-sanctum', "Obsidian Sanctum")?>
402 | - =nav_link('vault-of-archavon', "Vault of Archavon")?>
403 | - =nav_link('eye-of-eternity', "The Eye of Eternity")?>
404 | - =nav_link('ulduar', "Ulduar")?>
405 | - =nav_link('trial-of-the-crusader', "Trial of the Crusader")?>
406 | - =nav_link('onyxia', "Onyxia's Lair")?>
407 | - =nav_link('ruby-sanctum', "Ruby Sanctum")?>
408 | - =nav_link('icecrown-citadel', "Icecrown Citadel")?>
409 |
410 |
411 | - Cataclysm
412 |
413 | - =nav_link('baradin-hold', "Baradin Hold")?>
414 | - =nav_link('bastion-of-twilight', "Bastion of Twilight")?>
415 | - =nav_link('throne-of-four-winds', "Throne of the Four Winds")?>
416 | - =nav_link('blackwing-descent', "Blackwing Descent")?>
417 | - =nav_link('firelands', "Firelands")?>
418 | - =nav_link('dragon-soul', "Dragon Soul")?>
419 |
420 |
421 | - Mists of Pandaria
422 |
423 | - =dead_link("Mogu'shan Vaults")?>
424 | - =dead_link("Heart of Fear")?>
425 | - =dead_link("Terrace of Endless Spring")?>
426 |
427 |
428 |
429 |
430 | - Misc
431 |
432 | - =nav_link('undercity', 'Undercity')?>
433 | - =nav_link('ironforge', 'Ironforge')?>
434 | - =nav_link('exodar', 'The Exodar')?>
435 | - =nav_link('subway', 'SW / IF Subway')?>
436 | - =nav_link('caverns-of-time', 'Caverns of Time')?>
437 | - =nav_link('dalaran', 'Dalaran')?>
438 | - =nav_link('darkmoon-faire', 'Darkmoon Faire Isle')?>
439 | - =nav_link('firelands-dailies', 'Firelands Dailies')?>
440 | - =dead_link("The Wandering Isle")?>
441 |
442 |
443 |
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 |
233 |
234 |

235 |
236 |
237 | function nav_link($k, $v){
238 | global $map;
239 | $v = str_replace(array_keys($GLOBALS['logo_map']), $GLOBALS['logo_map'], $v);
240 | $url = $k == '_' ? '/' : "/$k/";
241 | if ($k == $map){
242 | return "
$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 |
264 | - =nav_link('_', 'Azeroth')?>
265 | - =nav_link('outland', 'Outland')?>
266 | - =nav_link('vashjir', 'Vash\'jir')?>
267 | - =nav_link('deepholm', 'Deepholm')?>
268 | - PvP
269 |
270 | - Battlegrounds
271 |
272 | - =nav_link('warsong-gulch', 'Warsong Gulch')?>
273 | - =nav_link('arathi-basin', 'Arathi Basin')?>
274 | - =nav_link('alterac-valley', 'Alterac Valley')?>
275 | - =nav_link('eye-of-the-storm', 'Eye of the Storm {BC}')?>
276 | - =nav_link('strand-of-the-ancients', 'Strand of the Ancients {Wrath}')?>
277 | - =nav_link('isle-of-conquest', 'Isle of Conquest {Wrath}')?>
278 | - =nav_link('battle-for-gilneas', 'Battle for Gilneas {Cata}')?>
279 | - =nav_link('twin-peaks', 'Twin Peaks {Cata}')?>
280 | - =dead_link("Silver Shard Mine {MoP}")?>
281 | - =dead_link("Temple of Kotmogu {MoP}")?>
282 | - =dead_link("Unnamed CTF {MoP}")?>
283 |
284 |
285 | - Arenas
286 |
287 | - =dead_link("The Ring of Valor {BC}")?>
288 | - =dead_link("The Ruins of Lordaeron {BC}")?>
289 | - =dead_link("The Ring of Trials {BC}")?>
290 | - =dead_link("The Circle of Blood {BC}")?>
291 | - =dead_link("The Dalaran Arena {Wrath}")?>
292 | - =dead_link("Tol'vir Proving Grounds {MoP}")?>
293 |
294 |
295 |
296 |
297 | - Dungeons
298 |
299 | - Classic
300 |
301 | - =nav_link('ragefire-chasm', "Ragefire Chasm")?>
302 | - =nav_link('deadmines', "Deadmines")?>
303 | - =nav_link('wailing-caverns', "Wailing Caverns")?>
304 | - =nav_link('shadowfang-keep', "Shadowfang Keep")?>
305 | - =nav_link('blackfathom-deeps', "Blackfathom Deeps")?>
306 | - =nav_link('stockade', "The Stockade")?>
307 | - =nav_link('gnomeregan', "Gnomeregan")?>
308 | - =nav_link('scarlet-monastery', "Scarlet Monastery")?>
309 | - =nav_link('razorfen-kraul', "Razorfen Kraul")?>
310 | - =nav_link('maraudon', "Maraudon")?>
311 | - =nav_link('uldaman', "Uldaman")?>
312 | - =nav_link('dire-maul', "Dire Maul")?>
313 | - =nav_link('scholomance', "Scholomance")?>
314 | - =nav_link('razorfen-downs', "Razorfen Downs")?>
315 | - =nav_link('stratholme', "Stratholme")?>
316 | - =nav_link('zul-farrak', "Zul'Farrak")?>
317 | - =nav_link('blackrock-depths', "Blackrock Depths")?>
318 | - =nav_link('sunken-temple', "Temple of Atal'Hakkar")?>
319 | - =nav_link('lower-blackrock-spire', "Lower Blackrock Spire")?>
320 | - =nav_link('upper-blackrock-spire', "Upper Blackrock Spire")?>
321 |
322 |
323 | - The Burning Crusade
324 |
325 | - =nav_link('hellfire-ramparts', "Hellfire Ramparts")?>
326 | - =nav_link('blood-furnace', "The Blood Furnace")?>
327 | - =nav_link('shattered-halls', "Shattered Halls")?>
328 | - =nav_link('slave-pens', "Slave Pens")?>
329 | - =nav_link('underbog', "The Underbog")?>
330 | - =nav_link('steamvault', "The Steamvault")?>
331 | - =nav_link('mana-tombs', "Mana-Tombs")?>
332 | - =nav_link('auchenai-crypts', "Auchenai Crypts")?>
333 | - =nav_link('sethekk-halls', "Sethekk Halls")?>
334 | - =nav_link('shadow-labyrinth', "Shadow Labyrinth")?>
335 | - =nav_link('durnholde-keep', "Durnholde Keep")?>
336 | - =nav_link('black-morass', "Black Morass")?>
337 | - =nav_link('mechanar', "The Mechanar")?>
338 | - =nav_link('botanica', "The Botanica")?>
339 | - =nav_link('arcatraz', "The Arcatraz")?>
340 | - =nav_link('magisters-terrace', "Magisters' Terrace")?>
341 |
342 |
343 | - Wrath of the Lich King
344 |
345 | - =nav_link('utgarde-keep', "Utgarde Keep")?>
346 | - =nav_link('nexus', "The Nexus")?>
347 | - =nav_link('old-kingdom', "Ahn'kahet: The Old Kingdom")?>
348 | - =nav_link('azjol-nerub', "Azjol-Nerub")?>
349 | - =nav_link('drak-tharon-keep', "Drak'Tharon Keep")?>
350 | - =nav_link('violet-hold', "The Violet Hold")?>
351 | - =nav_link('gundrak', "Gundrak")?>
352 | - =nav_link('halls-of-stone', "Halls of Stone")?>
353 | - =nav_link('halls-of-lightning', "Halls of Lightning")?>
354 | - =nav_link('oculus', "The Oculus")?>
355 | - =nav_link('culling-of-stratholme', "Culling of Stratholme")?>
356 | - =nav_link('utgarde-pinnacle', "Utgarde Pinnacle")?>
357 | - =nav_link('trial-of-the-champion', "Trial of the Champion")?>
358 | - =nav_link('forge-of-souls', "Forge of Souls")?>
359 | - =nav_link('pit-of-saron', "Pit of Saron")?>
360 | - =nav_link('halls-of-reflection', "Halls of Reflection")?>
361 |
362 |
363 | - Cataclysm
364 |
365 | - =nav_link('throne-of-the-tides', "Throne of the Tides")?>
366 | - =nav_link('blackrock-caverns', "Blackrock Caverns")?>
367 | - =nav_link('stonecore', "The Stonecore")?>
368 | - =nav_link('vortex-pinnacle', "Vortex Pinnacle")?>
369 | - =nav_link('lost-city', "Lost City of the Tol'vir")?>
370 | - =nav_link('halls-of-origination', "Halls of Origination")?>
371 | - =nav_link('grim-batol', "Grim Batol")?>
372 | - =nav_link('zul-aman', "Zul'Aman")?>
373 | - =nav_link('zul-gurub', "Zul'Gurub")?>
374 | - =nav_link('end-time', "End Time")?>
375 | - =nav_link('well-of-eternity', "Well of Eternity")?>
376 | - =nav_link('hour-of-twilight', "Hour of Twilight")?>
377 |
378 |
379 | - Mists of Pandaria
380 |
381 | - =dead_link("Temple of the Jade Serpent")?>
382 | - =dead_link("Stormstout Brewery")?>
383 | - =dead_link("Shado-pan Monastery")?>
384 | - =dead_link("Gate of the Setting Sun")?>
385 | - =dead_link("Mogu'Shan Palace")?>
386 | - =dead_link("The Perfect Storm")?>
387 | - =dead_link("Crypt of Forgotten Kings")?>
388 | - =dead_link("Temple of the Red Crane")?>
389 | - =dead_link("Temple of the White Tiger")?>
390 | - =dead_link("Scholomance (90)")?>
391 | - =dead_link("Scarlet Cathedral")?>
392 | - =dead_link("Scarlet Halls")?>
393 |
394 |
395 |
396 |
397 | - Raids
398 |
399 | - Classic
400 |
401 | - =nav_link('molten-core', "Molten Core")?>
402 | - =nav_link('blackwing-lair', "Blackwing Lair")?>
403 | - =nav_link('aq-ruins', "Ruins of Ahn'Qiraj")?>
404 | - =nav_link('aq-temple', "Temple of Ahn'Qiraj")?>
405 |
406 |
407 | - The Burning Crusade
408 |
409 | - =nav_link('karazhan', "Karazhan")?>
410 | - =nav_link('gruul', "Gruul's Lair")?>
411 | - =nav_link('magtheridon', "Magtheridon's Lair")?>
412 | - =nav_link('serpentshrine-cavern', "Serpentshrine Cavern")?>
413 | - =nav_link('the-eye', "The Eye")?>
414 | - =nav_link('mount-hyjal', "Battle for Mount Hyjal")?>
415 | - =nav_link('black-temple', "Black Temple")?>
416 | - =nav_link('sunwell', "Sunwell Plateau")?>
417 |
418 |
419 | - Wrath of the Lich King
420 |
421 | - =nav_link('naxxramas', "Naxxramas")?>
422 | - =nav_link('obsidian-sanctum', "Obsidian Sanctum")?>
423 | - =nav_link('vault-of-archavon', "Vault of Archavon")?>
424 | - =nav_link('eye-of-eternity', "The Eye of Eternity")?>
425 | - =nav_link('ulduar', "Ulduar")?>
426 | - =nav_link('trial-of-the-crusader', "Trial of the Crusader")?>
427 | - =nav_link('onyxia', "Onyxia's Lair")?>
428 | - =nav_link('ruby-sanctum', "Ruby Sanctum")?>
429 | - =nav_link('icecrown-citadel', "Icecrown Citadel")?>
430 |
431 |
432 | - Cataclysm
433 |
434 | - =nav_link('baradin-hold', "Baradin Hold")?>
435 | - =nav_link('bastion-of-twilight', "Bastion of Twilight")?>
436 | - =nav_link('throne-of-four-winds', "Throne of the Four Winds")?>
437 | - =nav_link('blackwing-descent', "Blackwing Descent")?>
438 | - =nav_link('firelands', "Firelands")?>
439 | - =nav_link('dragon-soul', "Dragon Soul")?>
440 |
441 |
442 | - Mists of Pandaria
443 |
444 | - =dead_link("Mogu'shan Vaults")?>
445 | - =dead_link("Heart of Fear")?>
446 | - =dead_link("Terrace of Endless Spring")?>
447 |
448 |
449 |
450 |
451 | - Misc
452 |
453 | - =nav_link('undercity', 'Undercity')?>
454 | - =nav_link('ironforge', 'Ironforge')?>
455 | - =nav_link('exodar', 'The Exodar')?>
456 | - =nav_link('subway', 'SW / IF Subway')?>
457 | - =nav_link('caverns-of-time', 'Caverns of Time')?>
458 | - =nav_link('dalaran', 'Dalaran')?>
459 | - =nav_link('darkmoon-faire', 'Darkmoon Faire Isle')?>
460 | - =nav_link('firelands-dailies', 'Firelands Dailies')?>
461 | - =dead_link("The Wandering Isle")?>
462 |
463 |
464 |
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 |
--------------------------------------------------------------------------------