Generování map z klienta

Z WoWResource Wiki
Přejít na: navigace, hledání

K vygenerování map z klienta budete potřebovat:

  • WoW klient
    • Extrakce BLP textur
    • Extrakce DBC souborů (WorldMapArea.dbc a WorldMapOverlay.dbc)
  • 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

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

  1. 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
  2. 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
  3. 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)
  4. čekejte až skript skončí činnost
  5. výsledek je vygenerovaný ve složce out.

Formát použitých DBC souborů

WorldMapOverlay.dbc
Sloupec Pole Typ Poznámka
1 ID Integer Interní ID (?)
2 iRefID_WorldMapArea Integer Zone ID
3 iRefID_AreaTable Integer Area ID
4 iRefID_AreaTable Integer
5 iRefID_AreaTable Integer
6 iRefID_AreaTable Integer
7 Neznámé NULL
8 Neznámé NULL
9 sRefPath String Základní název textury
10 Width Integer Šířka fragmentu
11 Height Integer Výška fragmentu
12 Left Integer X koordinát fragmentu na mapě
13 Top Integer Y koordinát fragmentu na mapě
14 Y1 Integer Bounding Box Top
15 X1 Integer Bounding Box Left
16 Y2 Integer Bounding Box Bottom
17 X2 Integer Bounding Box Right


WorldMapArea.dbc
Sloupec Pole Typ Poznámka
1 ID Integer
2 iRefID_Map Integer pravděpodobně odkaz na WorldMapContinent.dbc sloupec 2.
3 iRefID_AreaTable Integer
4 sRefCon String Interní jméno zóny
5 Y1 Float Levý horní Y koordinát mapy
6 Y2 Float Pravý spodní Y koordinát mapy
7 X1 Float Levý horní Y koordinát mapy
8 X2 Float Pravý spodní Y koordinát mapy
9 iRefID_Map Integer virutální ID mapy


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

  1. 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.
  2. 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

  1. 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
  2. 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)
  3. rozpakujte někam balíček, přehrajte tam soubor md5translate.trs
  4. do složky Minimap (u rozpakovaného balíčku) nahrajte zkonvertované textury minimapy (nyní ve formátu PNG)
  5. 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 +-)
  6. konzolově spusťte soubor konverzejpeg.php (platí shodné upozornění jako u předchozího souboru)
  7. 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, budu vycházet z obrázku: Generovanimap-prepocet1.png

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.

Generovanimap-prepocet2.png

Praktické použití najdete v souborech jinamapa.php a pouzevypocet.php

Externí odkazy

Pozn.: mapy a ostatní grafika ze hry World of Warcraft jsou (C) spol. Blizzard Entertainment, struktura DBC souborů je převzata ze stránek WowDev wiki