Generování map z klienta
K vygenerování map z klienta budete potřebovat:
- WoW klient
- PHP (www.php.net), knihovna GD2
- na minimapy také MyWarcraftStudio (nebo jiný univerzální extraktor MPQ souborů)
- troška pochopení a znalost programování / matematiky
Obsah
Generování WorldMap (textury shodné s klasickými mapami
Obsah balíčku (viz externí odkazy)
- Složka extract:
- extractMapsGB.bat - extrahuje mapy a dbc z enGB klienta
- extractMapsUS.bat - extrahuje mapy a dbc z enUS klienta
- MPQE - extraktor z MPQ souborů (autorem je the WRS)
- BLPconverter - převádí wow BLP formát na použitelný PNG
- Složka php:
- dbcreader.php - třída k načtení dbc souborů
- loader.php - mezistupeň mezi dbc a vlastním skriptem (zachováno z historických důvodů. dříve jsem parsoval csv, tvořený pomocí DBCutil)
- maps.php - vlastní skript na vytvoření map, skript je co nejvíce komentován pro pochopení činnosti
Princip činnosti skriptu
- Načtení souboru WorldMapArea.dbc - obsahuje název zóny, její id a wow koordináty (pro danou mapu, lze je použít pro přesné zobrazení npc/hráčů na této HQ mapě)
- Projití všech položek ve WMA
- Každá mapa ve wow je složena z 12 fragmentů, jedná se o 3 řádky po 4 sloupcích, toto je zachováno u každé mapy. Takto získáme slepou mapu (bez vyplněných detailů jako když je postupně objevujete ve wow)
- V první řadě skript složí v paměti z těchto fragmentů celou mapu. Poté se prochází soubor WorldMapOverlay a hledají se dílčí detailní části této mapy (dle id), jsou zapsány do pole fragmentů a poté samostatně zpracovány.
- Jednotlivé detailní části (fragmenty) jsou složitější na zpracování, z dbc je možné vyčíst jeho velikost a umístění na mapě. Vlastní rozdělení do souborů je nutné rozpočítat podle velikosti. Jeden soubor nemá nikdy větší rozměry než 256x256px. Jednotlivé soubory fragmentů jsou pak takto zpracovány a zapsány na příslušné pozice do mapy. Jsou vynechávány tzv. pixelfix fragmenty a některé další soubory, které způsobovaly individuální problémy.
Generování map skriptem
- nakopírujte obsah složky "extract" do adresáře DATA ve vašem wowu, a poté otevřete extractMapsGB / extractMapsUS podle jazykové lokalizace vašeho klienta. vyčkejte na dokončení operací až se okno zavře
- někam na disk nahrajte složku php. do složky worldmap přehrajte všechny soubory, které jsou v adresáři u wow - MPQOUT\Interface\WorldMap\, dbc soubory nahrejte k souboru maps.php
- otevřete příkazový řádek ve složce, kde se nachází soubor maps.php, zadejte cestu k vašemu souboru php.exe s parametrem maps.php (např: c:\php\php.exe maps.php nebo "c:\program files\xampp\php\php.exe" maps.php)
- čekejte až skript skončí činnost
- výsledek je vygenerovaný ve složce out.
Generování minimap
Obsah balíčku (viz externí odkazy)
- Složka extract:
- BLPconvertor - konverze BLP na PNG
- konverze.bat - dávková konverze BLP souborů
- Složka php:
- minimap.php - vytvoření minimap ze souboru md5translate.trs
- jinamapa.php - příklad zobrazení na mapě, připraven princip detekce zóny dle obdelníkových bloků
- imagestripper.php - DEPRECATED, see doimg.php
- blocksgen.php - načtení "bloků" do db
- doimg.php - roztrhání velkých textur na jednotlivé zóny
- minispecs.php - předvytvořené pole informací o rozměrech jednotlivých zón, pokud změníte nastavení v souboru doimg.php je nutné toto upravit na základě nového soubor out-minimaps.txt
- transports.php - testovací soubor, načítá DBC TaxiPathNode.dbc
- pouzevypocet.php - příklad a vysvětlení výpočtu pozice na mapě z WOW souřadnic
- konverzejpeg.php - konverze PNG map na JPEG formát
Princip činnosti skriptu
- Je načten soubor md5translate.trs, který obsahuje informaci o původním názvu souboru a jeho md5 podobně, vše je řazeno pod skupiny.
- Klasické mapy jsou vytvořeny ze znalosti, že mapa je utvořena mřížkou 64x64 tilů, 1tile v texturách má velikost 256x256px. WMO světy nejsou prozatím implementovány
Generování map skriptem
- Za pomocí MyWarcraftStudio vyextrahujte následující složky/soubor:
- common.mpq - složka "textures/Minimap/*.*"
- patch.mpq - složky "textures/Minimap/*.*" a "Textures/Minimap/*.*" (ano jsou tam dvě s různým počátečním písmenem!)
- patch-2.mpq - složka "textures/Minimap/md5translate.trs"
- pokud máte nějaký další patch soubor nebo uvnitř MPQ souboru složku textures/Minimap rovněž je vyextrahujte
- nakopírujte BLPconvertor a konverze.bat k minimapám ve formátu BLP, zapněte konverzi a vyčkejte (celkem se jedná o cca 17000 souborů, konverze může zabrat i hodinu! průběžně můžete kontrolovat počet zbývajících BLP souborů souborovým manažerem)
- rozpakujte někam balíček, přehrajte tam soubor md5translate.trs
- do složky Minimap (u rozpakovaného balíčku) nahrajte zkonvertované textury minimapy (nyní ve formátu PNG)
- konzolově spusťte soubor minimap.php, některé mapy (Azeroth, Expansion01 a Kalimdor) jsou velmi velké, doporučuji vypnout vše ostatní a nechat tento soubor v klidu proběhnout, špičkové využití RAM paměti se vzhledem k velkým rozměrům textury v truecolor režimu může vyšplhat až na 1GB +-)
- konzolově spusťte soubor konverzejpeg.php (platí shodné upozornění jako u předchozího souboru)
- konzolově spusťte soubor doimg.php (optimální krok, po tomto se vygenerují mapy jednotlivých zón)
Přepočet WoW souřadnic na zobrazitelné body na mapě
Toto zřejmě někteří nepochopíte, využívá se zde analytické geometrie a experimentálních zjištěnísmile.gif Budu vycházet z obrázku:
z obrázku vyplívá jednak to, že souřadnicové systémy, na kterém budeme projektovat a ze kterého vycházíme má osy inverzní a ještě prohozené (x,y <=> y,x). Na obrázku jsou naznačeny nám známé body, levý horní roh má své wow souřadnice X0,Y0 a v projektovém světě je to počátek tedy 0,0. Koncový pravý dolní bod je rovněž znám. Dále známe souřadnice zobrazovaného bodu Xx,Yx, ale neznáme souřadnice v druhé soustavě a,b. Využil jsem dvou vektorů z počátku a z konce, které si jsou v obou souřadnicových systémech geometricky podobné. Z vektoru Va vyplívá (sorry chybí mě tu čárka nad rovnicí, ale tohle fórum vzorečky nebere a já sem línej)
Va = XxX0 = X0 - Xx
ale také pro druhý souřadnicový sytém (je použito b, protože souřadnice jsou inverzní viz vpravo nahoře)
Va = b0 = = 0 - b
Z vektoru Vb vyplívá
Vb = XxX1 = X1 - Xx
ale také pro druhý souř.s.
Vb = bh = h - b
všechny změny ve stejných vektorech jsou navzájem uměrné, pokud se Va zvětší, zmenší se Vb. proto využijeme poměr Va / Vb = konst.
Praktické použití najdete v souborech jinamapa.php a pouzevypocet.php
Externí odkazy
Pozn.: mapy a ostatní grafika jsou (C) spol. Blizzard Entertainment