Fix Reveal World Map drawing overlays in the wrong place

The module drew every overlay from a hand-maintained Turtle WoW table that no
longer matches the client: the OctoWoW client redrew the overlays of every
zone, so revealed areas came out misplaced, stretched or missing, worst of
all in Stonetalon Mountains. It also redrew the explored overlays from that
table, so even explored areas moved.

- mods/worldmap-reveal-data.lua lists the overlays of every zone, generated
  from the client's own WorldMapArea.dbc and WorldMapOverlay.dbc by
  tools/gen-worldmap-reveal-data.py. It replaces the Turtle WoW table.
- Explored overlays are left to the game. The module only adds the
  unexplored ones after the textures the game used, and resets the dimming
  on textures the game reuses.
- If the data disagrees with an overlay the game reports, the zone is left
  as the game drew it. A client patch that changes the map then shows the
  plain map until the data is regenerated, not misplaced textures.
- Overlays are matched by file name ignoring case, since some of the
  client's overlay names are mixed case.
This commit is contained in:
2026-10-13 17:15:39 +00:00
parent d03121b67f
commit b5cd216880
4 changed files with 212 additions and 110 deletions
+69 -110
View File
@@ -58,63 +58,10 @@ ShaguTweaks.MapOverlayData = {
["Moonglade"] = { "LAKEELUNEARA:555:510:244:89", }
}
-- Turtle WoW MapOverlayData
if TargetHPText and TargetHPPercText then
ShaguTweaks.MapOverlayData = {
["Durotar"] = { "RAZORHILL:220:230:432:170", "VALLEYOFTRIALS:215:215:355:320", "KOLKARCRAG:160:120:413:476", "SENJINVILLAGE:160:190:474:384", "ECHOISLES:200:240:549:427", "THUNDERRIDGE:190:200:327:60", "DRYGULCHRAVINE:210:160:427:78", "TIRAGARDEKEEP:190:180:462:286", "RAZORMANEGROUNDS:230:230:301:189", "SKULLROCK:128:110:464:33", "ORGRIMMAR:445:160:244:0", },
["Mulgore"] = { "REDCLOUDMESA:470:243:270:425", "BLOODHOOFVILLAGE:256:200:367:303", "RAVAGEDCARAVAN:128:120:473:260", "REDROCKS:205:230:502:16", "THEVENTURECOMINE:225:235:532:238", "WINTERHOOFWATERWELL:170:128:458:369", "THUNDERHORNWATERWELL:128:155:379:242", "WILDMANEWATERWELL:185:128:291:0", "BAELDUNDIGSITE:210:180:255:214", "PALEMANEROCK:128:205:303:307", "WINDFURYRIDGE:205:128:395:0", "THEGOLDENPLAINS:215:240:428:80", "THEROLLINGPLAINS:256:190:523:356", "THUNDERBLUFF:280:240:249:59", },
["Barrens"] = { "BAELMODAN:128:128:431:479", "CAMPTAURAJO:145:125:365:350", "FARWATCHPOST:100:165:564:52", "THECROSSROADS:155:155:431:118", "BOULDERLODEMINE:120:110:555:0", "THESLUDGEFEN:170:120:456:0", "THEDRYHILLS:200:145:317:29", "DREADMISTPEAK:128:105:419:63", "NORTHWATCHFOLD:150:120:527:307", "THEFORGOTTENPOOLS:120:125:384:115", "LUSHWATEROASIS:175:185:365:177", "THESTAGNANTOASIS:155:128:481:211", "FIELDOFGIANTS:210:150:355:402", "THEMERCHANTCOAST:95:100:581:247", "RATCHET:125:125:556:189", "RAZORFENDOWNS:155:115:407:553", "RAPTORGROUNDS:115:110:507:294", "BRAMBLESCAR:125:165:442:298", "THORNHILL:140:128:498:119", "AGAMAGOR:200:185:340:234", "BLACKTHORNRIDGE:155:128:335:462", "HONORSSTAND:128:128:306:130", "THEMORSHANRAMPART:128:100:412:0", "GROLDOMFARM:125:115:492:63", "RAZORFENKRAUL:128:128:341:537", },
["Alterac"] = { "LORDAMEREINTERNMENTCAMP:330:265:44:403", "DALARAN:300:300:26:262", "STRAHNBRAD:370:300:549:105", "RUINSOFALTERAC:255:255:270:197", "CRUSHRIDGEHOLD:280:240:334:162", "THEUPLANDS:235:200:462:77", "GALLOWSCORNER:200:200:406:279", "GAVINSNAZE:160:175:225:478", "SOFERASNAZE:255:320:462:307", "CORRAHNSDAGGER:195:288:399:380", "THEHEADLAND:165:197:314:471", "MISTYSHORE:220:280:196:131", "DANDREDSFOLD:285:230:276:0", "GROWLESSCAVE:190:170:317:372", "CHILLWINDPOINT:350:370:626:253", },
["Arathi"] = { "NORTHFOLDMANOR:230:240:192:90", "GOSHEKFARM:230:195:531:276", "DABYRIESFARMSTEAD:180:210:472:165", "BOULDERFISTHALL:215:235:432:362", "WITHERBARKVILLAGE:215:210:559:333", "REFUGEPOINT:175:225:370:186", "HAMMERFALL:205:250:655:120", "STROMGARDEKEEP:240:230:108:287", "FALDIRSCOVE:256:215:171:424", "CIRCLEOFEASTBINDING:160:230:558:112", "CIRCLEOFWESTBINDING:190:210:138:54", "CIRCLEOFINNERBINDING:210:185:286:310", "CIRCLEOFOUTERBINDING:170:155:419:293", "THANDOLSPAN:200:220:355:412", "THORADINSWALL:190:240:87:138", "BOULDERGOR:245:245:232:145", },
["Badlands"] = { "APOCRYPHANSREST:255:205:17:310", "ANGORFORTRESS:195:200:325:148", "LETHLORRAVINE:370:455:611:110", "KARGATH:240:255:0:148", "CAMPKOSH:220:220:551:48", "CAMPBOFF:255:280:501:341", "CAMPCAGG:255:220:12:428", "AGMONDSEND:265:270:345:389", "HAMMERTOESDIGSITE:200:195:445:120", "VALLEYOFFANGS:230:230:349:256", "THEDUSTBOWL:270:275:159:199", "MIRAGEFLATS:285:240:148:384", "THEMAKERSTERRACE:245:205:389:7", "DUSTWINDGULCH:245:205:498:209", },
["BlastedLands"] = { "DARKPORTAL:265:220:453:259", "THETAINTEDSCAR:384:450:212:178", "DREADMAULHOLD:195:180:361:15", "NETHERGARDEKEEP:185:190:559:30", "DREADMAULPOST:245:195:361:195", "SERPENTSCOIL:225:170:501:140", "ALTAROFSTORMS:185:155:310:133", "GARRISONARMORY:170:200:472:9", "RISEOFTHEDEFILER:170:145:405:123", },
["Tirisfal"] = { "BULWARK:230:205:698:362", "DEATHKNELL:245:205:227:328", "SOLLIDENFARMSTEAD:256:156:239:250", "AGAMANDMILLS:256:210:335:139", "BRILL:128:158:537:299", "MONASTARY:211:189:746:125", "BRIGHTWATERLAKE:201:288:587:139", "GARRENSHAUNT:174:220:497:145", "BALNIRFARMSTEAD:216:179:630:326", "COLDHEARTHMANOR:150:128:474:327", "CRUSADEROUTPOST:173:128:694:289", "SCARLETWATCHPOST:175:247:689:104", "STILLWATERPOND:186:128:395:277", "NIGHTMAREVALE:243:199:363:349", "VENOMWEBVALE:237:214:757:205", "RUINSOFLORDAERON:315:235:463:361", },
["Silverpine"] = { "FENRISISLE:250:215:593:74", "PYREWOODVILLAGE:140:125:391:446", "DEEPELEMMINE:160:170:470:261", "THESKITTERINGDARK:185:165:286:37", "THESEPULCHER:210:160:352:168", "OLSENSFARTHING:165:185:382:252", "THEGREYMANEWALL:210:215:379:447", "BERENSPERIL:240:180:491:417", "AMBERMILL:240:240:494:262", "SHADOWFANGKEEP:220:160:364:359", "THEDECREPITFERRY:180:185:457:144", "MALDENSORCHARD:256:160:465:0", "THEDEADFIELD:175:165:402:65", "THESHININGSTRAND:256:220:459:13", "NORTHTIDESHOLLOW:180:128:323:128", },
["WesternPlaguelands"] = { "HEARTHGLEN:340:288:307:16", "NORTHRIDGELUMBERCAMP:220:180:382:164", "RUINSOFANDORHOL:285:230:260:355", "SORROWHILL:300:206:355:462", "THEWEEPINGCAVE:160:200:566:198", "FELSTONEFIELD:160:125:300:311", "DALSONSTEARS:220:150:381:265", "GAHRRONSWITHERING:180:205:520:250", "THEWRITHINGHAUNT:170:190:451:323", "THEBULWARK:225:185:137:293", "DARROWMERELAKE:370:270:504:343", "CAERDARROW:170:165:600:412", "THONDRORILRIVER:205:340:590:86", },
["EasternPlaguelands"] = { "THEFUNGALVALE:210:210:271:261", "THEMARRISSTEAD:200:205:156:360", "THEUNDERCROFT:185:150:172:477", "DARROWSHIRE:210:179:309:489", "CROWNGUARDTOWER:205:165:291:401", "CORINSCROSSING:165:160:537:367", "TYRSHAND:245:170:717:471", "LIGHTSHOPECHAPEL:175:245:716:299", "THENOXIOUSGLADE:225:215:722:166", "EASTWALLTOWER:180:160:592:241", "NORTHDALE:190:205:620:128", "ZULMASHAR:205:165:614:30", "NORTHPASSTOWER:240:195:457:109", "QUELLITHIENLODGE:230:150:422:36", "PLAGUEWOOD:360:270:169:83", "STRATHOLME:240:200:194:9", "THONDRORILRIVER:220:360:7:231", "LAKEMERELDAR:250:175:537:463", "THEINFECTISSCAR:195:275:620:291", "PESTILENTSCAR:205:250:409:345", "BLACKWOODLAKE:230:235:442:199", "TERRORDALE:190:205:79:98", },
["Hilsbrad"] = { "SOUTHSHORE:235:270:418:201", "TARRENMILL:220:310:509:0", "DURNHOLDEKEEP:384:365:605:75", "SOUTHPOINTTOWER:288:225:2:192", "HILLSBRADFIELDS:305:275:198:155", "AZURELOADMINE:165:200:175:275", "NETHANDERSTEAD:215:240:541:236", "DUNGAROK:240:275:637:294", "EASTERNSTRAND:230:320:524:339", "WESTERNSTRAND:285:155:208:368", "PURGATIONISLE:125:100:109:482", "DARROWHILL:205:155:414:154", },
["Hinterlands"] = { "THEOVERLOOKCLIFFS:170:310:693:303", "AERIEPEAK:255:205:13:245", "QUELDANILLODGE:185:195:237:185", "SKULKROCK:160:145:512:232", "SHADRAALOR:195:185:240:387", "JINTHAALOR:235:285:505:333", "THEALTAROFZUL:200:165:373:365", "SERADANE:275:275:509:19", "PLAGUEMISTRAVINE:145:220:158:149", "VALORWINDLAKE:170:170:319:302", "AGOLWATHA:205:195:374:164", "HIRIWATHA:225:200:171:306", "THECREEPINGRUIN:180:170:408:260", "SHAOLWATHA:280:205:571:239", },
["DunMorogh"] = { "KHARANOS:200:200:386:294", "ANVILMAR:240:185:155:403", "GNOMERAGON:180:165:166:184", "GOLBOLARQUARRY:165:165:608:291", "FROSTMANEHOLD:125:125:217:287", "THEGRIZZLEDDEN:200:185:314:311", "BREWNALLVILLAGE:115:115:252:249", "MISTYPINEREFUGE:128:165:502:221", "ICEFLOWLAKE:128:180:281:167", "HELMSBEDLAKE:155:170:694:273", "COLDRIDGEPASS:150:128:295:385", "CHILLBREEZEVALLEY:180:128:274:296", "SHIMMERRIDGE:128:190:347:163", "AMBERSTILLRANCH:128:128:573:280", "THETUNDRIDHILLS:155:128:522:322", "SOUTHERNGATEOUTPOST:128:120:792:279", "NORTHERNGATEOUTPOST:128:165:759:173", "IRONFORGE:315:200:397:163", },
["SearingGorge"] = { "THECAULDRON:425:325:250:170", "GRIMSILTDIGSITE:305:220:494:300", "FIREWATCHRIDGE:405:430:85:30", "THESEAOFCINDERS:360:280:247:388", "BLACKCHARCAVE:275:235:77:366", "TANNERCAMP:305:230:545:407", "DUSTFIREVALLEY:460:365:422:8", },
["BurningSteppes"] = { "DREADMAULROCK:220:225:707:168", "RUINSOFTHAURISSAN:270:285:513:99", "BLACKROCKSTRONGHOLD:245:265:334:114", "PILLAROFASH:320:270:377:285", "BLACKROCKMOUNTAIN:256:280:173:101", "ALTAROFSTORMS:225:220:36:109", "BLACKROCKPASS:270:310:589:279", "MORGANSVIGIL:294:270:708:311", "TERRORWINGPATH:280:355:722:46", "DRACODAR:415:315:56:258", },
["Elwynn"] = { "NORTHSHIREVALLEY:256:256:381:147", "CRYSTALLAKE:225:220:422:332", "FARGODEEPMINE:256:240:238:428", "FORESTSEDGE:256:341:124:327", "BRACKWELLPUMPKINPATCH:256:249:577:419", "STONECAIRNLAKE:310:256:587:190", "GOLDSHIRE:240:220:250:270", "EASTVALELOGGINGCAMP:256:210:704:330", "TOWEROFAZORA:255:250:551:292", "JERODSLANDING:256:237:425:431", "RIDGEPOINTTOWER:306:233:696:435", "STORMWIND:485:405:0:0", },
["DeadwindPass"] = { "THEVICE:270:270:426:299", "KARAZHAN:300:245:269:337", "DEADMANSCROSSING:380:365:249:76", },
["Duskwood"] = { "DARKSHIRE:315:280:631:162", "VULGOLOGREMOUND:255:285:243:348", "RAVENHILL:195:145:102:302", "TRANQUILGARDENSCEMETARY:220:220:690:353", "THEROTTINGORCHARD:250:230:539:369", "BRIGHTWOODGROVE:220:340:504:117", "THEYORGENFARMSTEAD:235:250:390:382", "RAVENHILLCEMETARY:350:300:85:149", "ADDLESSTEAD:275:250:55:342", "THEDARKENEDBANK:910:210:89:31", "TWILIGHTGROVE:360:420:298:79", "THEHUSHEDBANK:160:330:19:132", "MANORMISTMANTLE:200:175:653:120", },
["LochModan"] = { "IRONBANDSEXCAVATIONSITE:345:256:482:321", "MOGROSHSTRONGHOLD:315:235:542:48", "THELSAMAR:256:230:217:203", "STONEWROUGHTDAM:290:175:339:11", "THEFARSTRIDERLODGE:370:295:546:199", "SILVERSTREAMMINE:235:270:229:11", "THELOCH:320:410:352:87", "NORTHGATEPASS:230:300:125:12", "STONESPLINTERVALLEY:255:285:215:348", "VALLEYOFKINGS:195:250:109:370", "GRIZZLEPAWRIDGE:295:358:309:310", },
["Redridge"] = { "LAKEEVERSTILL:535:275:133:240", "LAKESHIRE:340:195:83:197", "STONEWATCH:255:300:500:215", "STONEWATCHFALLS:320:210:595:320", "REDRIDGECANYONS:365:245:121:72", "ALTHERSMILL:235:270:399:129", "RENDERSCAMP:275:256:277:0", "RENDERSVALLEY:465:255:484:361", "GALARDELLVALLEY:250:250:654:161", "LAKERIDGEHIGHWAY:430:290:187:333", "THREECORNERS:365:350:0:284", },
["Stranglethorn"] = { "ZULGURUB:245:220:483:8", "BOOTYBAY:145:128:203:433", "LAKENAZFERITI:128:125:331:59", "WILDSHORE:165:190:229:422", "REBELCAMP:170:90:284:0", "NESINGWARYSEXPEDITION:140:110:269:26", "KURZENSCOMPOUND:155:150:388:0", "RUINSOFZULKUNDA:125:140:196:3", "RUINSOFZULMAMWE:170:125:394:212", "THEVILEREEF:190:175:152:90", "MOSHOGGOGREMOUND:128:175:432:94", "GROMGOLBASECAMP:110:105:260:132", "ZUULDAIARUINS:115:115:156:42", "BALALRUINS:90:80:241:92", "KALAIRUINS:95:95:299:88", "BALIAMAHRUINS:110:140:371:129", "ZIATAJAIRUINS:128:125:364:231", "MIZJAHRUINS:105:110:311:131", "JAGUEROISLE:125:120:314:493", "CRYSTALVEINMINE:120:120:345:276", "RUINSOFABORAZ:95:95:350:335", "RUINSOFJUBUWAL:110:110:306:301", "MISTVALEVALLEY:125:125:280:368", "NEKMANIWELLSPRING:90:115:211:359", "BLOODSAILCOMPOUND:165:175:194:284", "VENTURECOBASECAMP:105:125:387:64", "THEARENA:200:185:235:189", },
["SwampOfSorrows"] = { "POOLOFTEARS:300:275:565:218", "STONARD:360:315:279:237", "FALLOWSANCTUARY:365:305:492:0", "MISTYVALLEY:245:305:0:140", "MISTYREEDSTRAND:256:668:746:0", "THEHARBORAGE:235:205:171:145", "ITHARIUSSCAVE:240:245:0:262", "SORROWMURK:215:365:724:120", "SPLINTERSPEARJUNCTION:275:240:129:236", "STAGALBOG:345:250:552:378", "THESHIFTINGMIRE:315:235:286:110", },
["Westfall"] = { "MOONBROOK:220:200:317:331", "SALDEANSFARM:225:210:459:105", "SENTINELHILL:195:240:442:241", "FURLBROWSPUMPKINFARM:210:215:387:11", "JANGOLODEMINE:215:215:307:29", "GOLDCOASTQUARRY:225:256:220:102", "WESTFALLLIGHTHOUSE:280:190:205:467", "ALEXSTONFARMSTEAD:305:210:204:260", "THEJANSENSTEAD:165:200:488:0", "THEDEADACRE:200:240:524:252", "THEMOLSENFARM:225:205:328:148", "THEDAGGERHILLS:256:175:339:418", "DEMONTSPLACE:200:185:208:375", "THEDUSTPLAINS:288:235:523:377", },
["Wetlands"] = { "WHELGARSEXCAVATIONSITE:195:185:247:205", "MENETHILHARBOR:175:128:13:314", "DUNMODR:205:180:401:21", "IRONBEARDSTOMB:200:185:349:115", "DIREFORGEHILL:256:250:507:115", "RAPTORRIDGE:190:160:628:176", "BLACKCHANNELMARSH:240:175:77:245", "MOSSHIDEFEN:205:245:527:264", "THELGANROCK:230:190:470:371", "BLUEGILLMARSH:225:190:89:142", "SALTSPRAYGLEN:200:240:237:41", "SUNDOWNMARSH:300:240:92:82", "THEGREENBELT:185:240:456:125", "ANGERFANGENCAMPMENT:225:185:347:218", "GRIMBATOL:350:360:611:230", },
["Teldrassil"] = { "DOLANAAR:190:128:462:323", "SHADOWGLEN:225:225:491:153", "LAKEALAMETH:256:185:436:380", "STARBREEZEVILLAGE:200:200:561:292", "GNARLPINEHOLD:185:128:368:443", "THEORACLEGLADE:170:240:272:127", "WELLSPRINGLAKE:180:256:377:93", "POOLSOFARLITHRIEN:128:190:335:313", "RUTTHERANVILLAGE:128:100:494:548", "BANETHILHOLLOW:160:210:382:281", "DARNASSUS:315:256:101:247", },
["Darkshore"] = { "AUBERDINE:150:215:318:162", "RUINSOFMATHYSTRA:195:215:510:0", "TOWEROFALTHALAXX:170:195:468:85", "BASHALARAN:180:195:365:181", "AMETHARAN:190:205:324:306", "GROVEOFTHEANCIENTS:200:170:305:412", "THEMASTERSGLAIVE:175:158:329:510", "REMTRAVELSEXCAVATION:175:183:229:485", "CLIFFSPRINGRIVER:230:190:375:94", },
["Ashenvale"] = { "MAESTRASPOST:215:305:205:38", "THEZORAMSTRAND:245:245:19:28", "ASTRANAAR:205:185:272:251", "THESHRINEOFAESSINA:220:195:104:259", "FIRESCARSHRINE:165:175:189:324", "THERUINSOFSTARDUST:155:150:260:373", "THEHOWLINGVALE:210:185:463:141", "MYSTRALLAKE:275:240:356:347", "FALLENSKYLAKE:235:205:547:426", "IRISLAKE:200:205:392:218", "RAYNEWOODRETREAT:180:245:520:238", "NIGHTRUN:225:255:597:258", "SATYRNAAR:285:185:694:225", "FELFIREHILL:245:255:713:344", "WARSONGLUMBERCAMP:200:160:796:311", "BOUGHSHADOW:146:200:856:151", "LAKEFALATHIM:128:195:131:137", "THISTLEFURVILLAGE:255:195:203:158", },
["ThousandNeedles"] = { "THESHIMMERINGFLATS:320:365:610:300", "CAMPETHOK:305:310:0:0", "SPLITHOOFCRAG:210:195:391:192", "HIGHPERCH:190:190:31:155", "THESCREECHINGCANYON:250:240:179:200", "FREEWINDPOST:210:190:357:264", "THEGREATLIFT:210:180:205:70", "DARKCLOUDPINNACLE:205:195:259:131", "WINDBREAKCANYON:240:220:492:250", },
["StonetalonMountains"] = { "SUNROCKRETREAT:512:256:256:256", "WINDSHEARCRAG:256:256:512:256", "MIRKFALLONLAKE:512:512:256:0", "THECHARREDVALE:256:512:256:256", "STONETALONPEAK:256:256:256:0", "WEBWINDERPATH:256:512:512:256", "AMANIALOR:512:256:0:0", "GRIMTOTEMPOST:512:256:512:512", "CAMPAPARAJE:512:256:512:512", "MALAKAJIN:512:256:512:512", "BOULDERSLIDERAVINE:256:256:512:512", "SISHIRCANYON:256:512:512:256", "VENTURECOMPANYCAMP:256:512:256:0", "BLACKSANDOILFIELDS:512:512:0:0", "POWDERTOWN:256:256:256:256", "BRAMBLETHORNPASS:512:512:512:256", "BAELHARDUL:512:256:512:256", "BROKENCLIFFMINE:256:512:256:0", "THEEARTHENRING:512:256:256:256", },
["Desolace"] = { "KODOGRAVEYARD:275:250:387:244", "THUNDERAXEFORTRESS:190:220:447:102", "MANNOROCCOVEN:285:280:399:380", "SARGERON:285:245:625:33", "MAGRAMVILLAGE:205:285:590:365", "GELKISVILLAGE:195:242:293:426", "VALLEYOFSPEARS:245:285:212:215", "NIJELSPOINT:200:250:554:0", "KOLKARVILLAGE:220:220:607:215", "SHADOWBREAKRAVINE:205:195:690:444", "TETHRISARAN:205:145:431:0", "ETHELRETHOR:205:250:311:61", "RANAZJARISLE:100:100:241:6", "KORMEKSHUT:170:160:555:181", "SHADOWPREYVILLAGE:230:230:167:389", },
["Feralas"] = { "CAMPMOJACHE:155:160:689:233", "GRIMTOTEMCOMPOUND:120:195:623:167", "THEWRITHINGDEEP:240:220:618:298", "GORDUNNIOUTPOST:140:165:690:141", "FERALSCARVALE:115:115:486:329", "FRAYFEATHERHIGHLANDS:110:170:478:386", "THEFORGOTTENCOAST:145:320:404:256", "DREAMBOUGH:150:125:454:0", "ONEIROS:110:110:493:70", "RUINSOFRAVENWIND:190:155:305:0", "THETWINCOLOSSALS:285:245:319:75", "SARDORISLE:180:180:208:234", "ISLEOFDREAD:215:293:192:375", "LOWERWILDS:225:180:751:198", "RUINSOFISILDIEN:190:250:540:320", "DIREMAUL:230:195:454:201", },
["Dustwallow"] = { "BRACKENWALLVILLAGE:280:270:230:0", "WITCHHILL:250:315:422:0", "THEDENOFFLAME:255:250:257:313", "THEWYRMBOG:285:240:367:381", "THERAMOREISLE:230:205:534:224", "ALCAZISLAND:200:195:660:21", "BACKBAYWETLANDS:400:255:239:189", },
["Tanaris"] = { "GADGETZAN:175:165:421:91", "STEAMWHEEDLEPORT:155:150:592:75", "ZULFARRAK:210:175:254:0", "SANDSORROWWATCH:195:175:299:100", "THISTLESHRUBVALLEY:185:250:203:286", "THEGAPINGCHASM:220:210:449:372", "THENOXIOUSLAIR:180:200:252:199", "DUNEMAULCOMPOUND:205:145:325:289", "EASTMOONRUINS:160:150:395:346", "WATERSPRINGFIELD:165:180:509:168", "ZALASHJISDEN:110:140:611:147", "LANDSENDBEACH:205:157:445:511", "VALLEYOFTHEWATCHERS:150:160:291:434", "SOUTHMOONRUINS:195:210:323:359", "LOSTRIGGERCOVE:160:190:629:220", "NOONSHADERUINS:120:135:533:104", "BROKENPILLAR:110:180:473:234", "ABYSSALSANDS:215:180:363:194", "SOUTHBREAKSHORE:215:175:499:293", "CAVERNSOFTIME:155:150:561:256", },
["Aszhara"] = { "TIMBERMAWHOLD:235:270:250:106", "LEGASHENCAMPMENT:235:140:478:44", "THALASSIANBASECAMP:240:155:499:119", "RUINSOFELDARATH:265:280:238:221", "URSOLAN:145:215:422:95", "TEMPLEOFARKKORAN:190:200:681:153", "BAYOFSTORMS:270:300:479:201", "THESHATTEREDSTRAND:160:210:404:194", "TOWEROFELDARA:120:155:818:107", "JAGGEDREEF:570:170:366:0", "SOUTHRIDGEBEACH:370:220:389:353", "RAVENCRESTMONUMENT:240:125:552:499", "FORLORNRIDGE:220:255:191:369", "LAKEMENNAR:315:200:296:429", "SHADOWSONGSHRINE:225:180:35:422", "HALDARRENCAMPMENT:200:150:77:331", "VALORMOK:215:175:84:229", "THERUINEDREACHES:395:128:396:540", "BITTERREACHES:245:185:644:40", },
["Felwood"] = { "DEADWOODVILLAGE:175:135:408:533", "FELPAWVILLAGE:240:145:483:0", "JAEDENAR:245:128:271:331", "BLOODVENOMFALLS:235:145:292:263", "SHATTERSCARVALE:235:200:307:123", "IRONTREEWOODS:215:215:420:54", "TALONBRANCHGLADE:160:145:548:90", "MORLOSARAN:145:159:496:509", "EMERALDSANCTUARY:185:160:405:429", "JADEFIREGLEN:165:155:332:465", "RUINSOFCONSTELLAS:235:155:297:381", "JADEFIRERUN:195:170:330:29", },
["UngoroCrater"] = { "FIREPLUMERIDGE:295:270:367:178", "LAKKARITARPITS:570:265:160:6", "TERRORRUN:345:285:158:368", "THESLITHERINGSCAR:345:285:367:380", "GOLAKKAHOTSPRINGS:315:345:121:151", "THEMARSHLANDS:310:355:560:240", "IRONSTONEPLATEAU:285:285:582:67", },
["Moonglade"] = { "LAKEELUNEARA:555:510:244:89", },
["Silithus"] = { "THESCARABWALL:288:256:116:413", "SOUTHWINDVILLAGE:384:384:500:65", "THECRYSTALVALE:320:289:104:24", "HIVEASHI:512:320:265:12", "HIVEZORA:384:512:97:144", "HIVEREGAL:512:384:245:285", "TWILIGHTBASECAMP:320:256:344:197", },
["Winterspring"] = { "FROSTSABERROCK:250:180:368:7", "THEHIDDENGROVE:175:185:555:27", "TIMBERMAWPOST:230:120:229:243", "WINTERFALLVILLAGE:145:125:617:158", "MAZTHORIL:185:180:493:258", "FROSTFIREHOTSPRINGS:240:140:222:172", "ICETHISTLEHILLS:125:165:611:242", "FROSTWHISPERGORGE:200:160:523:376", "OWLWINGTHICKET:165:140:593:340", "LAKEKELTHERIL:215:185:401:198", "STARFALLVILLAGE:185:160:392:137", "EVERLOOK:165:200:509:107", "DARKWHISPERGORGE:255:205:447:441", },
["AlteracValley"] = { "DUNBALDAR:270:240:348:13", "ICEBLOODGARRISON:300:300:335:172", "FROSTWOLFKEEP:235:290:399:375", },
["Hyjal"] = { "BLEAKHOLLOWCRATER:512:512:256:0", "NORDRASSILGLADE:512:512:512:0", "NORDANAAR:256:512:768:0", "BARKSKINPLATEAU:512:256:256:256", "BARKSKINVILLAGE:768:512:256:256", "CIRCLEOFPOWER:512:512:0:0", "RUINSOFTELENNAS:512:512:0:0", "ZULHATHA:256:512:0:0", "DARKHOLLOWPASS:512:512:256:256", "THEEMERALDGATEWAY:512:512:0:256", },
["Lapidis"] = { "SHANKSREEF:512:256:256:0", "CROWNISLAND:256:256:512:0", "THEROCK:256:256:512:0", "BRIGHTCOAST:768:512:0:0", "ZULHAZU:512:512:256:256", "WALLOWINGCOAST:512:256:256:256", "HAZURRIGLADE:512:256:256:256", "GORDOSHHEIGHTS:256:512:256:0", "CAELANSREST:256:512:512:0", "TOWEROFLAPIDIS:512:512:256:0", },
["Gillijim"] = { "DEEPTIDESANCTUM:512:256:0:512", "SILVERCOAST:512:512:256:256", "SILVERSANDBAR:256:512:256:256", "ZULRAZAR:256:256:256:256", "TANGLEWOOD:256:256:512:256", "JADEMINE:512:256:256:256", "RUINSOFZULRAZAR:512:512:256:256", "GILLIJIMSTRAND:256:512:512:0", "MAULOGGREFUGE:512:512:512:256", "MAULOGGPOST:256:512:512:256", "KALKORPOINT:512:512:256:0", "KAZONISLAND:512:256:256:0", "SOUTHSEASANDBAR:512:256:0:0", "DISTILLERYISLE:512:512:0:0", "FAELONSFOLLY:256:256:256:256", },
["TelAbim"] = { "TELCOBASECAMP:512:512:256:256", "BIXXLESSTOREHOUSE:512:512:256:0", "HIGHVALERISE:512:512:256:0", "THEDERELICTCAMP:512:256:256:256", "TAZZOSSHACK:512:512:256:256", "THEJAGGEDISLES:512:512:256:0", },
["Gilneas"] = { "GILNEASCITY:512:512:0:0", "RAVENSHIRE:512:512:256:256", "RAVENWOODKEEP:512:512:256:256", "BROLOKMOUND:512:256:256:256", "SOUTHMIREORCHARD:256:256:256:256", "HOLLOWWEBWOODS:256:512:256:256", "HOLLOWWEBCEMETARY:512:512:0:256", "SHADEMORETAVERN:256:256:256:256", "RUINSOFGREYSHIRE:512:256:0:256", "NORTHGATETOWER:512:512:256:0", "ROSEWICKPLANTATION:256:512:256:0", "GLAYMORESTEAD:512:256:256:0", "THEOVERGROWNACRE:512:256:256:256", "THEDRYROCKPIT:512:256:0:256", "THEDRYROCKMINE:512:256:0:256", "FREYSHEARKEEP:256:256:512:256", "GREYMANESWATCH:256:256:512:256", "OLDROCKPASS:256:256:256:0", "STILLWARDCHURCH:512:512:256:0", "THEGREYMANEWALL:512:256:256:0", "BLACKTHORNSCAMP:256:512:0:0", "DAWNSTONEMINE:256:512:256:0", },
["Icepoint"] = { "KANEQNUUN:1024:768:0:0", },
["BlackstoneIsland"] = { "RUSTGATERIDGE:512:512:256:256", "BLACKASHCOALPITS:512:768:0:0", "BLACKASHMINE:512:512:256:0", "THEWATERHOLE:512:512:256:0", "GAZZIKSWORKSHOP:512:512:256:256", "VENTURECOSLUMS:512:512:256:0", "RUSTGATELUMBERYARD:256:512:512:0", },
["ThalassianHighlands"] = { "ALAHTHALAS:768:512:256:0", "SILVERSUNMINE:256:512:256:256", "FELSTRIDERRETREAT:512:512:0:256", "THEFARSTRIDE:512:512:0:0", "ISLEOFETERNALAUTUMN:512:512:0:0", "ANASTERIANPARK:512:512:256:0", "BRINTHILIEN:512:512:256:256", "RUINSOFNASHALARAN:512:512:0:0", "THELASTRUNESTONE:512:512:256:256", },
["UpperKarazhan2f"] = { "OUTLAND:1024:768:0:0", },
["GrimReaches"] = { "DUNKITHAS:512:256:256:256", "THEGRIMHOLLOW:512:512:256:256", "LAKEKITHAS:512:256:256:256", "SLATEBEARDSFORGE:512:256:256:256", "THEHIGHPASS:256:256:256:256", "SALGAZMINES:256:256:512:256", "EASTRIDGEOUTPOST:512:512:256:0", "BAGGOTHSRAMPART:256:512:256:0", "RUINSOFSTOLGAZKEEP:256:256:256:0", "GROLDANSEXCAVATION:256:512:512:0", "ZARMGETHSTRONGHOLD:512:256:256:0", "GETHKAR:512:256:256:0", "ZARMGETHPOINT:512:256:256:0", "SHATTERBLADEPOST:256:256:512:0", "BRANGARSFOLLY:256:256:512:0", "BARLEYCRESTFARMSTEAD:512:512:256:0", },
["Balor"] = { "GULLWINGWRECKAGE:512:256:0:0", "BILGERATCOMPOUND:256:256:256:0", "SIOUTPOST:256:512:512:256", "RUINSOFBREEZEHAVEN:512:256:256:256", "CROAKINGPLATEAU:512:512:256:0", "LANGSTONORCHARD:256:256:256:256", "SORROWMORELAKE:256:256:256:256", "SCURRYINGTHICKET:256:512:256:0", "STORMWROUGHTCASTLE:512:256:256:256", "STORMREAVERSPIRE:512:512:256:256", "WINDROCKCLIFFS:256:512:256:256", "TREACHEROUSCRAGS:512:512:256:256", "VANDERFARMSTEAD:256:256:256:256", "GRAHANESTATE:256:256:256:256", "STORMBREAKERPOINT:512:512:512:0", },
["Northwind"] = { "MERCHANTSHIGHROAD:512:512:256:256", "AMBERSHIRE:512:256:256:256", "AMBERWOODKEEP:512:256:0:256", "CRYSTALFALLS:512:512:512:256", "CRAWFORDWINERY:256:256:512:256", "NORTHWINDLOGGINGCAMP:256:512:256:0", "WITCHCOVEN:256:256:256:0", "RUINSOFBIRKHAVEN:512:512:512:0", "SHERWOODQUARRY:512:512:512:0", "BLACKROCKBREACH:512:512:512:0", "GRIMMENLAKE:256:512:512:256", "ABBEYGARDENS:256:256:512:0", "STILLHEARTPORT:512:512:0:0", "TOWEROFMAGILOU:512:512:0:0", "BRISTLEWHISKERCAVERN:256:512:512:0", "NORTHRIDGEPOINT:512:512:256:0", "CINDERFALLPASS:512:512:512:256", },
}
-- Turtle WoW based clients (OctoWoW): use the overlay data generated from the
-- client's own WorldMapOverlay.dbc, see mods/worldmap-reveal-data.lua
if TargetHPText and TargetHPPercText and ShaguTweaks.MapOverlayDataOctoWoW then
ShaguTweaks.MapOverlayData = ShaguTweaks.MapOverlayDataOctoWoW
end
module.enable = function(self)
@@ -151,17 +98,6 @@ module.enable = function(self)
["Interface\\WorldMap\\Silverpine\\BERENSPERIL"] = {offsetY={417,415}},
}
local function create_hash(prefix, textureName, textureWidth, textureHeight, offsetX, offsetY, mapPointX, mapPointY)
local hash = string.format(":%s:%s:%s:%s",textureWidth,textureHeight,offsetX,offsetY)
if (mapPointX ~= 0 or mapPointY ~= 0) then
hash = string.format("%s:%s:%s",hash,tostring(mapPointX),tostring(mapPointY))
end
if string.sub(textureName, 0, string.len(prefix)) == prefix then
return string.format("%s%s",string.sub(textureName, string.len(prefix) + 1),hash)
end
return string.format("|%s",hash)
end
local function unpack_hash(prefix, hash)
local _, stored_prefix, textureName, textureWidth, textureHeight, offsetX, offsetY, mapPointX, mapPointY, name
_, _, stored_prefix, textureName, textureWidth, textureHeight, offsetX, offsetY = string.find(hash, "^([|]?)([^:]+):([^:]+):([^:]+):([^:]+):([^:]+)")
@@ -182,8 +118,18 @@ module.enable = function(self)
return textureName, textureWidth + 0, textureHeight + 0, offsetX + 0, offsetY + 0, mapPointX + 0, mapPointY + 0, name
end
-- overlays are matched by their upper-cased file name, as path and case can
-- differ between the game's overlay info and the data tables
local function overlay_key(textureName)
local _, _, file = string.find(textureName, "([^\\]+)$")
return string.upper(file or textureName)
end
local function geometry(textureWidth, textureHeight, offsetX, offsetY)
return string.format("%d:%d:%d:%d", textureWidth, textureHeight, offsetX, offsetY)
end
local explores = {}
local explorecaches = {}
local exploreEnter = function()
WorldMapTooltip:ClearLines()
@@ -197,9 +143,11 @@ module.enable = function(self)
WorldMapTooltip:Hide()
end
local overlayData
local function ShaguTweaksWorldMapFrame_Update()
-- create metatable if not yet created
this.overlayData = this.overlayData or setmetatable(ShaguTweaks.MapOverlayData, {__index = function(t,k)
overlayData = overlayData or setmetatable(ShaguTweaks.MapOverlayData, {__index = function(t,k)
local v = {}
rawset(t,k,v)
return v
@@ -210,13 +158,20 @@ module.enable = function(self)
if (not mapFileName) then mapFileName = "World" end
local prefix = string.format("Interface\\WorldMap\\%s\\",mapFileName)
local numOverlays = GetNumMapOverlays()
local alreadyknown = {}
for i=1, numOverlays do
local textureName, textureWidth, textureHeight, offsetX, offsetY, mapPointX, mapPointY = GetMapOverlayInfo(i)
local overlayHash = create_hash(textureName, textureWidth, textureHeight, offsetX, offsetY, mapPointX, mapPointY)
alreadyknown[textureName] = overlayHash
-- the game has already drawn the explored overlays into the first
-- WorldMapOverlay textures: remember them and count the textures used
local known = {}
local textureCount = 0
for i=1, GetNumMapOverlays() do
local textureName, textureWidth, textureHeight, offsetX, offsetY = GetMapOverlayInfo(i)
known[overlay_key(textureName)] = geometry(textureWidth, textureHeight, offsetX, offsetY)
textureCount = textureCount + math.ceil(textureWidth / 256) * math.ceil(textureHeight / 256)
end
-- those textures can still be dimmed from an earlier update
for i=1, textureCount do
_G[string.format("%s%s","WorldMapOverlay",i)]:SetVertexColor(1,1,1,1)
end
-- hide all exploration points
@@ -224,36 +179,48 @@ module.enable = function(self)
frame:Hide()
end
local zoneData = this.overlayData[mapFileName]
local textureCount = 0
local texturePixelWidth, textureFileWidth, texturePixelHeight, textureFileHeight
if not enabled then return end
local zoneData = overlayData[mapFileName]
-- leave the zone as the game drew it when the data disagrees with an
-- explored overlay: the client's map changed and the data is outdated
for i, hash in ipairs(zoneData) do
local textureName, textureWidth, textureHeight, offsetX, offsetY = unpack_hash(prefix, hash)
local drawn = textureName and known[overlay_key(textureName)]
if drawn and drawn ~= geometry(textureWidth, textureHeight, offsetX, offsetY) then
return
end
end
for i, hash in ipairs(zoneData) do
local textureName, textureWidth, textureHeight, offsetX, offsetY, mapPointX, mapPointY, name = unpack_hash(prefix, hash)
explores[i] = explores[i] or CreateFrame("Frame", nil, WorldMapDetailFrame)
local explore = explores[i]
explore:SetWidth(16)
explore:SetHeight(16)
explore:SetPoint("TOPLEFT", "WorldMapDetailFrame", "TOPLEFT", offsetX+textureWidth/2, -offsetY-textureHeight/2)
explore:SetScript("OnEnter", exploreEnter)
explore:SetScript("OnLeave", exploreLeave)
explore:EnableMouse(true)
explore:SetFrameLevel(255)
explore.name = mapFileName .. " (" .. name .. ")"
explore.tex = explore.tex or explore:CreateTexture("", "OVERLAY")
explore.tex:SetBlendMode("ADD")
explore.tex:SetTexCoord(.08, .92, .08, .92)
explore.tex:SetAllPoints()
-- add the unexplored overlays after the ones the game has drawn
if textureName and not known[overlay_key(textureName)] then
explores[i] = explores[i] or CreateFrame("Frame", nil, WorldMapDetailFrame)
local explore = explores[i]
explore:SetWidth(16)
explore:SetHeight(16)
explore:SetPoint("TOPLEFT", "WorldMapDetailFrame", "TOPLEFT", offsetX+textureWidth/2, -offsetY-textureHeight/2)
explore:SetScript("OnEnter", exploreEnter)
explore:SetScript("OnLeave", exploreLeave)
explore:EnableMouse(true)
explore:SetFrameLevel(255)
explore.name = mapFileName .. " (" .. (name or textureName) .. ")"
explore.tex = explore.tex or explore:CreateTexture("", "OVERLAY")
explore.tex:SetBlendMode("ADD")
explore.tex:SetTexCoord(.08, .92, .08, .92)
explore.tex:SetAllPoints()
-- show exploration points
if self.config["map.reveal.marker"] == "on" and enabled and not alreadyknown[textureName] then
explore.tex:SetTexture("Interface\\WorldMap\\WorldMap-MagnifyingGlass")
explore:Show()
else
explore:Hide()
end
-- show exploration points
if self.config["map.reveal.marker"] == "on" then
explore.tex:SetTexture("Interface\\WorldMap\\WorldMap-MagnifyingGlass")
explore:Show()
else
explore:Hide()
end
if enabled or alreadyknown[textureName] then
if errata[textureName] and errata[textureName].offsetX and errata[textureName].offsetX[1] == offsetX then
offsetX = errata[textureName].offsetX[2]
end
@@ -302,15 +269,7 @@ module.enable = function(self)
texture:ClearAllPoints()
texture:SetPoint("TOPLEFT", "WorldMapDetailFrame", "TOPLEFT", offsetX + (256 *(k - 1)), -(offsetY +(256 *(j - 1))))
texture:SetTexture(string.format("%s%s",textureName,(((j - 1) * numTexturesHorz) + k)))
explorecaches[name] = explorecaches[name] or {}
explorecaches[name][texture] = true
if not alreadyknown[textureName] then
texture:SetVertexColor(.4,.4,.4,1)
else
texture:SetVertexColor(1,1,1,1)
end
texture:SetVertexColor(.4,.4,.4,1)
texture:Show()
textureCount = textureCount + 1
end