2010-11-08 14:28:59 +01:00
QuestHelper_File [ " director_find.lua " ] = " 4.0.1.$svnversion$ "
2010-10-24 23:17:33 +02:00
QuestHelper_Loadtime [ " director_find.lua " ] = GetTime ( )
local function getitall ( name )
local segments = { }
for i = 1 , # name - 1 do
local sub = name : sub ( i , i + 1 ) : lower ( )
if not sub : find ( " " ) then
local dbi = DB_GetItem ( " find " , sub : byte ( 1 ) * 256 + sub : byte ( 2 ) , true )
--print("inserting", sub)
if not dbi then return { } end
segments [ dbi ] = true
end
end
local segwork = { }
for k in pairs ( segments ) do
table.insert ( segwork , { k , 1 , k [ 1 ] } )
end
local found = { }
while true do
local lowest = segwork [ 1 ] [ 3 ]
local highest = segwork [ 1 ] [ 3 ]
local lid = 1
for i = 2 , # segwork do
local v = segwork [ i ] [ 3 ]
--print("loop", i, lowest, highest, v, segwork[i][2])
if v < lowest then
--print("lower")
lowest , lid = v , i
end
if v > highest then
--print("higher")
highest = v
end
end
if lowest == highest then
table.insert ( found , lowest )
segwork [ 1 ] [ 2 ] = segwork [ 1 ] [ 2 ] + 1
if not segwork [ 1 ] [ 1 ] [ segwork [ 1 ] [ 2 ] ] then break end
segwork [ 1 ] [ 3 ] = segwork [ 1 ] [ 3 ] + segwork [ 1 ] [ 1 ] [ segwork [ 1 ] [ 2 ] ]
else
while segwork [ lid ] [ 3 ] < highest do
segwork [ lid ] [ 2 ] = segwork [ lid ] [ 2 ] + 1
if not segwork [ lid ] [ 1 ] [ segwork [ lid ] [ 2 ] ] then break end
segwork [ lid ] [ 3 ] = segwork [ lid ] [ 3 ] + segwork [ lid ] [ 1 ] [ segwork [ lid ] [ 2 ] ]
end
end
if not segwork [ lid ] [ 1 ] [ segwork [ lid ] [ 2 ] ] then break end
end
return found
end
local function generate_objective ( dbi )
local clooster = { }
local why = { desc = dbi.name , tracker_desc = dbi.name }
for _ , v in ipairs ( dbi.loc ) do
QuestHelper : Assert ( QuestHelper_ParentLookup )
QuestHelper : Assert ( QuestHelper_ParentLookup [ v.p ] , v.p )
table.insert ( clooster , { loc = { x = v.x , y = v.y , c = QuestHelper_ParentLookup [ v.p ] , p = v.p } , cluster = clooster , tracker_hidden = true , why = why , map_desc = { QuestHelper : HighlightText ( dbi.name ) } , tracker_desc = dbi.name , map_suppress_ignore = true , map_custom_menu = function ( menu ) QuestHelper : CreateMenuItem ( menu , QHText ( " FIND_REMOVE " ) ) : SetFunction ( function ( ) QH_Route_ClusterRemove ( clooster ) end ) end } )
end
QH_Route_ClusterAdd ( clooster )
end
local msfires = { desc = QHText ( " FIND_CUSTOM_LOCATION " ) , tracker_desc = QHText ( " FIND_CUSTOM_LOCATION " ) }
2011-01-24 00:58:29 +01:00
local function QH_FindLoc ( locd )
-- I just know some guy's gonna get pissed off because he was trying to find "loc crocolisk" or something, but screw him
local locx , locy , locz
locx , locy = locd : match ( " ^(%d+) (%d+)$ " )
if locx and locy then
locx , locy = tonumber ( locx ) , tonumber ( locy )
locz = QuestHelper_NameLookup [ QuestHelper_IndexLookup [ QuestHelper.routing_c ] [ QuestHelper.routing_z ] ]
end
if not locx then
locz , locx , locy = locd : match ( " ^(.+) (%d+) (%d+)$ " )
locx , locy = tonumber ( locx ) , tonumber ( locy )
end
if locz then
for z , nam in pairs ( QuestHelper_NameLookup ) do
if nam : lower ( ) : find ( locz : lower ( ) ) then
locz = z
break
end
2010-10-24 23:17:33 +02:00
end
2011-01-24 00:58:29 +01:00
if type ( locz ) == " number " then
local ec , ez = unpack ( QuestHelper_ZoneLookup [ locz ] )
local c , x , y = QuestHelper.Astrolabe : GetAbsoluteContinentPosition ( ec , ez , locx / 100 , locy / 100 )
local node = { loc = { x = x , y = y , p = locz , c = QuestHelper_ParentLookup [ locz ] } , why = msfires , map_desc = { QHText ( " FIND_CUSTOM_LOCATION " ) } , tracker_desc = QHText ( " FIND_CUSTOM_LOCATION " ) , tracker_hidden = true }
local cluster = { node }
node.cluster = cluster
2010-10-24 23:17:33 +02:00
2011-01-24 00:58:29 +01:00
node.map_suppress_ignore = true
node.map_custom_menu = function ( menu ) QuestHelper : CreateMenuItem ( menu , QHText ( " FIND_REMOVE " ) ) : SetFunction ( function ( ) QH_Route_ClusterRemove ( cluster ) end ) end
2010-10-24 23:17:33 +02:00
2011-01-24 00:58:29 +01:00
QH_Route_ClusterAdd ( cluster )
end
end
end
local elders = {
[ " Alliance " ] = {
[ " Bladeswift " ] = " Darnassus 39 32 " ,
[ " Bronzebeard " ] = " Ironforge 29 16 " ,
[ " Hammershout " ] = " Elwynn Forest 34 50 "
} ,
[ " Horde " ] = {
[ " Darkhorn " ] = " Orgrimmar 52 60 " ,
[ " Wheathoof " ] = " Thunder Bluff 72 33 " ,
[ " Darkcore " ] = " Undercity 67 38 "
} ,
[ " Kalimdor " ] = {
[ " Riversong " ] = " Ashenvale 35 48 " ,
[ " Skygleam " ] = " Azshara 64 79 " ,
[ " High Mountain " ] = " Southern Barrens 41 47 " , -- 41.5 47.5
[ " Moonwarden " ] = " Northern Barrens 48 59 " , -- 48.5 59.2
[ " Windtotem " ] = " Northern Barrens 68 69 " ,
[ " Starweave " ] = " Darkshore 49 19 " , -- 49.5 19.0
[ " Runetotem " ] = " Durotar 54 44 " ,
[ " Nightwind " ] = " Felwood 37 52 " ,
[ " Grimtotem " ] = " Feralas 76 37 " ,
[ " Mistwalker " ] = " Feralas 62 31 " ,
[ " Bloodhoof " ] = " Mulgore 48 53 " ,
[ " Bladesing " ] = " Silithus 53 35 " ,
[ " Primestone " ] = " Silithus 30 13 " , -- 30.7 13.3
[ " Dreamseer " ] = " Tanaris 50 28 " ,
[ " Ragetotem " ] = " Tanaris 36 80 " ,
[ " Bladeleaf " ] = " Teldrassil 57 53 " ,
[ " Skyseer " ] = " Thousand Needles 45 50 " ,
[ " Morningdew " ] = " Thousand Needles 77 75 " , -- 77.0 75.6
[ " Thunderhorn " ] = " Un'Goro Crater 51 75 " ,
[ " Brightspear " ] = " Winterspring 53 56 " , -- 53.0 56.7
[ " Stonespire " ] = " Winterspring 60 50 " , -- 60.0 50.0
} ,
[ " Eastern Kingdoms " ] = {
[ " Bellowrage " ] = " Blasted Lands 54 49 " ,
[ " Rumblerock " ] = " Burning Steppes 70 45 " ,
[ " Dawnstrider " ] = " Burning Steppes 53 24 " ,
[ " Goldwell " ] = " Dun Morogh 53 49 " ,
[ " Windrun " ] = " Eastern Plaguelands 35 68 " ,
[ " Snowcrown " ] = " Eastern Plaguelands 75 54 " ,
[ " Stormbrow " ] = " Elwynn Forest 40 63 " ,
[ " Highpeak " ] = " Hinterlands 50 48 " ,
[ " Silvervein " ] = " Loch Modan 33 46 " ,
[ " Ironband " ] = " Searing Gorge 21 79 " ,
[ " Obsidian " ] = " Silverpine Forest 45 41 " ,
[ " Starglade " ] = " Stranglethorn Vale 63 22 " , -- Jungle 71 34
[ " Winterhoof " ] = " Stranglethorn Vale 37 79 " , -- Cape 39 72
[ " Graveborn " ] = " Tirisfal Glades 61 53 " ,
[ " Moonstrike " ] = " Western Plaguelands 69 73 " ,
[ " Meadowrun " ] = " Western Plaguelands 63 36 " ,
[ " Skychaser " ] = " Westfall 56 47 "
} ,
[ " Northrend " ] = {
[ " Arp " ] = " Borean Tundra 57 44 " ,
[ " Northal " ] = " Borean Tundra 34 34 " ,
[ " Pamuya " ] = " Borean Tundra 43 50 " ,
[ " Sardis " ] = " Borean Tundra 59 66 " ,
[ " Morthie " ] = " Dragonblight 30 56 " ,
[ " Skywarden " ] = " Dragonblight 35 48 " ,
[ " Thoim " ] = " Dragonblight 49 78 " ,
[ " Beldak " ] = " Grizzly Hills 61 28 " ,
[ " Lunaro " ] = " Grizzly Hills 81 37 " ,
[ " Whurain " ] = " Grizzly Hills 64 47 " ,
[ " Bluewolf " ] = " Lake Wintergrasp 49 14 " ,
[ " Sandrene " ] = " Sholazar Basin 50 64 " ,
[ " Wanikaya " ] = " Sholazar Basin 64 49 " ,
[ " Fargal " ] = " Storm Peaks 29 74 " ,
[ " Graymane " ] = " Storm Peaks 41 85 " ,
[ " Muraco " ] = " Storm Peaks 64 51 " ,
[ " Stonebeard " ] = " Storm Peaks 31 38 " ,
[ " Tauros " ] = " Zul'Drak 59 56 "
}
}
local function QH_FindElders ( elder_or_achievement , all_elders )
local achievement_match , elder_match = false , false
for achievement , eldrs in pairs ( elders ) do
if not all_elders then
if elder_or_achievement == string.upper ( achievement ) then achievement_match = true end
end
for elder , elder_loc in pairs ( eldrs ) do
if not all_elders then
if achievement_match then -- just add it
QH_FindLoc ( string.upper ( elder_loc ) )
elseif elder_or_achievement == string.upper ( elder ) then -- We have input and it's not an achievement, so it must be an elder.
elder_match = true
QH_FindLoc ( string.upper ( elder_loc ) )
break -- We've found him or her.
end -- No need for else here. We alread know we don't need everything so we either have an achievement or we have an elder.
else -- We came in without an input, therefore we add all.
QH_FindLoc ( string.upper ( elder_loc ) )
2010-10-24 23:17:33 +02:00
end
end
2011-01-24 00:58:29 +01:00
if achievement_match or elder_match then break end -- We've done our match.
end
end
function QH_FindName ( name )
local locd = name : match ( " ^loc (.+) " )
local elder_loc
if not locd then
if name : find ( " ^elders? " ) then
elder_loc = name : match ( " elders? (.+) " )
if not elder_loc then elder_loc = true end
end
end
if locd then
QH_FindLoc ( locd )
elseif elder_loc then
if elder_loc == true then QH_FindElders ( nil , true )
else QH_FindElders ( elder_loc )
end
2010-10-24 23:17:33 +02:00
else
if not DB_Ready ( ) then
QuestHelper : TextOut ( QHText ( " FIND_NOT_READY " ) )
return
end
if # name < 2 then
QuestHelper : TextOut ( QHText ( " FIND_USAGE " ) )
return
end
local found = getitall ( name )
local mennix = QuestHelper : CreateMenu ( )
QuestHelper : CreateMenuTitle ( mennix , QHText ( " RESULTS_TITLE " ) )
local made_item = false
local found_db = { }
local has_name = { }
local needs_postfix = { }
for _ , v in ipairs ( found ) do
local dbi = DB_GetItem ( " monster " , v )
--[[ assert(dbi) ]]
if dbi.loc then
table.insert ( found_db , dbi )
if has_name [ dbi.name ] then needs_postfix [ dbi.name ] = true end
has_name [ dbi.name ] = true
end
end
table.sort ( found_db , function ( a , b ) return a.name < b.name end )
for _ , v in ipairs ( found_db ) do
made_item = true
local name = v.name
if needs_postfix [ name ] then name = name .. " ( " .. QuestHelper_NameLookup [ v.loc [ 1 ] . p ] .. " ) " end
local opt = QuestHelper : CreateMenuItem ( mennix , name )
opt : SetFunction ( generate_objective , v )
end
if not made_item then
QuestHelper : CreateMenuItem ( mennix , QHText ( " NO_RESULTS " ) )
end
mennix : ShowAtCursor ( )
end
end