Files
Questie-Octo/Map/ContinentProjection.lua
2026-08-16 20:28:28 -05:00

125 lines
8.3 KiB
Lua

QuestieOcto.ContinentProjection = QuestieOcto.ContinentProjection or {}
local C = QuestieOcto.ContinentProjection
-- Vanilla WorldMapArea bounds extracted by the authoritative pfQuest data toolchain.
-- They let zone-local quest coordinates be projected onto the continent map
-- without changing the canonical pfQuest coordinates stored on each node.
C.continents={
[0]={name="Azeroth",xMin=-16000,yMin=-19199.90039,xMax=7466.600098,yMax=16000},
[1]={name="Kalimdor",xMin=-11733.2998,yMin=-19733.21094,xMax=12799.90039,yMax=17066.59961},
}
C.zones={
[1]={continent=0,name="DunMorogh",xMin=-7160.416504,yMin=-3122.916504,xMax=-3877.083252,yMax=1802.083252},
[3]={continent=0,name="Badlands",xMin=-7547.916504,yMin=-4566.666504,xMax=-5889.583008,yMax=-2079.166504},
[4]={continent=0,name="BlastedLands",xMin=-12800,yMin=-4591.666504,xMax=-10566.66602,yMax=-1241.666626},
[8]={continent=0,name="SwampOfSorrows",xMin=-11150,yMin=-4516.666504,xMax=-9620.833008,yMax=-2222.916504},
[10]={continent=0,name="Duskwood",xMin=-11516.66602,yMin=-1866.666626,xMax=-9716.666016,yMax=833.333313},
[11]={continent=0,name="Wetlands",xMin=-4904.166504,yMin=-4525,xMax=-2147.916504,yMax=-389.583313},
[12]={continent=0,name="Elwynn",xMin=-10254.16602,yMin=-1935.416626,xMax=-7939.583008,yMax=1535.416626},
[14]={continent=1,name="Durotar",xMin=-1716.666626,yMin=-7249.999512,xMax=1808.333252,yMax=-1962.499878},
[15]={continent=1,name="Dustwallow",xMin=-5533.333008,yMin=-6225,xMax=-2033.333252,yMax=-974.999939},
[16]={continent=1,name="Aszhara",xMin=1960.416626,yMin=-8347.916016,xMax=5341.666504,yMax=-3277.083252},
[17]={continent=1,name="Barrens",xMin=-5143.75,yMin=-7510.416504,xMax=1612.499878,yMax=2622.916504},
[28]={continent=0,name="WesternPlaguelands",xMin=499.9999695,yMin=-3883.333252,xMax=3366.666504,yMax=416.6666565},
[33]={continent=0,name="Stranglethorn",xMin=-15422.91602,yMin=-4160.416504,xMax=-11168.75,yMax=2220.833252},
[36]={continent=0,name="Alterac",xMin=-366.6666565,yMin=-2016.666626,xMax=1500,yMax=783.333313},
[38]={continent=0,name="LochModan",xMin=-6327.083008,yMin=-4752.083008,xMax=-4487.5,yMax=-1993.749878},
[40]={continent=0,name="Westfall",xMin=-11733.33301,yMin=-483.333313,xMax=-9400,yMax=3016.666504},
[41]={continent=0,name="DeadwindPass",xMin=-11533.33301,yMin=-3333.333252,xMax=-9866.666016,yMax=-833.333313},
[44]={continent=0,name="Redridge",xMin=-10022.91602,yMin=-3741.666504,xMax=-8575,yMax=-1570.833252},
[45]={continent=0,name="Arathi",xMin=-2533.333252,yMin=-4466.666504,xMax=-133.3333282,yMax=-866.666626},
[46]={continent=0,name="BurningSteppes",xMin=-8983.333008,yMin=-3195.833252,xMax=-7031.249512,yMax=-266.6666565},
[47]={continent=0,name="Hinterlands",xMin=-1100,yMin=-5425,xMax=1466.666626,yMax=-1575},
[51]={continent=0,name="SearingGorge",xMin=-7587.499512,yMin=-2554.166504,xMax=-6100,yMax=-322.9166565},
[85]={continent=0,name="Tirisfal",xMin=824.999939,yMin=-1485.416626,xMax=3837.499756,yMax=3033.333252},
[130]={continent=0,name="Silverpine",xMin=-1133.333252,yMin=-750,xMax=1666.666626,yMax=3449.999756},
[139]={continent=0,name="EasternPlaguelands",xMin=1218.75,yMin=-6056.25,xMax=3799.999756,yMax=-2185.416504},
[141]={continent=1,name="Teldrassil",xMin=8437.5,yMin=-1277.083252,xMax=11831.25,yMax=3814.583252},
[148]={continent=1,name="Darkshore",xMin=3966.666504,yMin=-3608.333252,xMax=8333.333008,yMax=2941.666504},
[215]={continent=1,name="Mulgore",xMin=-3697.916504,yMin=-3089.583252,xMax=-272.9166565,yMax=2047.916626},
[267]={continent=0,name="Hilsbrad",xMin=-1733.333252,yMin=-2133.333252,xMax=400,yMax=1066.666626},
[331]={continent=1,name="Ashenvale",xMin=829.166626,yMin=-4066.666504,xMax=4672.916504,yMax=1699.999878},
[357]={continent=1,name="Feralas",xMin=-6999.999512,yMin=-1508.333252,xMax=-2366.666504,yMax=5441.666504},
[361]={continent=1,name="Felwood",xMin=3299.999756,yMin=-4108.333008,xMax=7133.333008,yMax=1641.666626},
[400]={continent=1,name="ThousandNeedles",xMin=-6899.999512,yMin=-4833.333008,xMax=-3966.666504,yMax=-433.333313},
[405]={continent=1,name="Desolace",xMin=-2545.833252,yMin=-262.5,xMax=452.083313,yMax=4233.333008},
[406]={continent=1,name="StonetalonMountains",xMin=-339.583313,yMin=-1637.499878,xMax=2916.666504,yMax=3245.833252},
[440]={continent=1,name="Tanaris",xMin=-10475,yMin=-7118.749512,xMax=-5875,yMax=-218.7499847},
[490]={continent=1,name="UngoroCrater",xMin=-8433.333008,yMin=-3166.666504,xMax=-5966.666504,yMax=533.333313},
[493]={continent=1,name="Moonglade",xMin=6952.083008,yMin=-3689.583252,xMax=8491.666016,yMax=-1381.25},
[618]={continent=1,name="Winterspring",xMin=3799.999756,yMin=-7416.666504,xMax=8533.333008,yMax=-316.6666565},
[1377]={continent=1,name="Silithus",xMin=-8281.25,yMin=-945.8339844,xMax=-5958.333984,yMax=2537.5},
[1497]={continent=0,name="Undercity",xMin=1237.841187,yMin=-86.18240356,xMax=1877.945312,yMax=873.192627},
[1519]={continent=0,name="Stormwind",xMin=-9175.205078,yMin=36.70063019,xMax=-8278.850586,yMax=1380.971436},
[1537]={continent=0,name="Ironforge",xMin=-5096.845703,yMin=-1504.216431,xMax=-4569.241211,yMax=-713.5913696},
[1637]={continent=1,name="Ogrimmar",xMin=1338.460571,yMin=-5083.205566,xMax=2273.877197,yMax=-3680.601074},
[1638]={continent=1,name="ThunderBluff",xMin=-1545.833252,yMin=-527.083313,xMax=-849.999939,yMax=516.666626},
[1657]={continent=1,name="Darnassis",xMin=9532.586914,yMin=1880.029541,xMax=10238.31641,yMax=2938.362793},
-- Turtle custom world zones reported missing from continent/world overview.
-- Bounds come from the supplied pfQuest WorldMapArea_turtle extractor data,
-- using the same coordinate convention as the Vanilla entries above.
[408]={continent=0,name="Gillijim",xMin=-14575.719727,yMin=1344.119995,xMax=-12528.709961,yMax=4436.220215},
[409]={continent=0,name="Lapidis",xMin=-12959.419922,yMin=2031.880005,xMax=-11043.480469,yMax=4933.330078},
[616]={continent=1,name="Hyjal",xMin=3983,yMin=-4286,xMax=6125,yMax=-1080},
[2040]={continent=0,name="AlahThalas",xMin=3931,yMin=-3637,xMax=4907,yMax=-2169},
[4012]={continent=0,name="ScarletEnclave",xMin=979,yMin=-7209,xMax=3087,yMax=-4050},
[5121]={continent=1,name="TelAbim",xMin=-9371,yMin=-8406,xMax=-7184,yMax=-5179},
[5179]={continent=0,name="Gilneas",xMin=-2801,yMin=-413,xMax=-359,yMax=3253},
[5225]={continent=0,name="ThalassianHighlands",xMin=2891,yMin=-4087,xMax=4952,yMax=-1005},
[5536]={continent=1,name="BlackstoneIsland",xMin=-866,yMin=-8746,xMax=799,yMax=-6274},
[5561]={continent=0,name="Balor",xMin=-9645,yMin=1630,xMax=-7577,yMax=4728},
[5581]={continent=0,name="Northwind",xMin=-8484,yMin=-983,xMax=-6327,yMax=2258},
[5602]={continent=0,name="GrimReaches",xMin=-6488,yMin=-7459,xMax=-2904,yMax=-2072},
-- Moonwhisper Coast post-dates the supplied WorldMapArea_turtle snapshot.
-- These bounds are reconstructed from the current Turtle server creature
-- world positions plus Questie-Octo's shipped 7856x5241 minimap world size.
[5642]={continent=1,name="MoonwhisperCoast",xMin=4963,yMin=-9210,xMax=10204,yMax=-1354},
}
function C:GetClientContinentMapID(clientContinentID)
clientContinentID=tonumber(clientContinentID)
if clientContinentID==1 then return 1 end -- Kalimdor
if clientContinentID==2 then return 0 end -- Eastern Kingdoms / Azeroth
return nil
end
function C:GetZoneContinent(mapID)
local z=self.zones[tonumber(mapID)]
return z and z.continent or nil
end
function C:Project(mapID,x,y)
local z=self.zones[tonumber(mapID)]
if not z then return nil,nil,nil end
local c=self.continents[z.continent]
x=tonumber(x); y=tonumber(y)
if not c or not x or not y then return nil,nil,nil end
local zw=z.xMax-z.xMin
local zh=z.yMax-z.yMin
local cw=c.xMax-c.xMin
local ch=c.yMax-c.yMin
if zw==0 or zh==0 or cw==0 or ch==0 then return nil,nil,nil end
-- pfQuest extractor conversion is:
-- localX = 100 - (worldY-yMin)/(yMax-yMin)*100
-- localY = 100 - (worldX-xMin)/(xMax-xMin)*100
local worldY=z.yMin+((100-x)/100)*zh
local worldX=z.xMin+((100-y)/100)*zw
local cx=100-((worldY-c.yMin)/ch)*100
local cy=100-((worldX-c.xMin)/cw)*100
if cx<0 or cx>100 or cy<0 or cy>100 then return nil,nil,z.continent end
return cx,cy,z.continent
end
function C:GetZoneMapIDs(continentMapID)
continentMapID=tonumber(continentMapID)
local result={}
for mapID,z in pairs(self.zones) do
if z.continent==continentMapID then table.insert(result,mapID) end
end
table.sort(result)
return result
end