ESOUI SVN EsoHeadMarkers

[/] [trunk/] [EsoheadMarkers/] [EsoheadMarkers.lua] - Rev 5

Compare with Previous | Blame | View Log

EHM = {
        ["skyshard"]    = "EsoUI/Art/Inventory/inventory_tabicon_quest_up.dds",
        ["chest"] = "EsoUI/Art/Inventory/inventory_tabicon_misc_up.dds"
        }
EHM.material = {
        {pinType = "mining", texture = "EsoUI/Art/MapPins/AvA_mine_Neutral.dds", tooltip = "Ore", size = 20 },
        {pinType = "clothing", texture = "EsoUI/Art/Characterwindow/gearslot_tabard.dds", tooltip = "Clothing Material", size = 20 },
        {pinType = "rune", texture = "EsoUI/Art/Crafting/enchantment_tabicon_essence_down.dds", tooltip = "Runestone", size = 20 },
        {pinType = "alchemy", texture = "EsoUI/Art/Crafting/alchemy_tabicon_reagent_down.dds", tooltip = "Alchemy Ingredient", size = 20 },
        {pinType = "provisioning", texture = "EsoheadMarkers/clothing.dds", tooltip = "Provision Material", size = 20 },
        {pinType = "wood", texture = "EsoUI/Art/MapPins/AvA_lumbermill_Neutral.dds", tooltip = "Wood", size = 20 }
}

EHM.layouts = {}

local function EHMChestCallback( g_mapPinManager )
        if not ZO_WorldMap_IsPinGroupShown("chest") then
                return
        end
        local zone = GetMapName()
        local chests = EH.savedVars["chest"].data[zone]
        if not chests then
                return
        end
        for _,chest in pairs(chests) do
                g_mapPinManager:CreatePin( _G["chest"], { chest[1], chest[2] }, chest[1], chest[2] )
        end

end

function EHMNotFound( zone, x, y)
        local foundShards = EHM.foundShards.zones[ zone ]
        local minFound, minShard
        local minDist = math.huge

        if not foundShards then
                return true
        end

        --get closest already collected shard
        for _, shard in pairs( foundShards ) do
                if zo_abs(shard[1] - x) + zo_abs(shard[2] - y) < minDist then
                        minFound = shard
                        minDist = zo_abs(shard[1] - x) + zo_abs(shard[2] - y)
                end
        end

        if not minFound then
                return true
        end

        --get closest shard
        minDist = math.huge

        for _, shard in pairs( EHMShards[ zone ] ) do
                if zo_abs(shard[1] - minFound[1]) + zo_abs(shard[2] - minFound[2]) < minDist then
                        minShard = shard
                        minDist = zo_abs(shard[1] - minFound[1]) + zo_abs(shard[2] - minFound[2])
                end
        end

        if not minShard then
                return true
        end
        -- if current shard and closest shard are the same, it is already collected
        return not (minShard[1] == x and minShard[2] == y)
end

local function EHMFoundSkyshardCallback( g_mapPinManager )
        if not ZO_WorldMap_IsPinGroupShown("found_skyshard") then
                return
        end
        local zone = GetMapName()
        local skyshards = EHMShards[ zone ]
        if not skyshards then
                return
        end

        for _,shard in pairs(skyshards) do
                if not EHMNotFound(zone, shard[1], shard[2]) then
                        g_mapPinManager:CreatePin( _G["found_skyshard"], { shard[1], shard[2] }, shard[1], shard[2] )
                end
        end
end

local function EHMSkyshardCallback( g_mapPinManager )
        if not ZO_WorldMap_IsPinGroupShown("skyshard") then
                return
        end
        local zone = GetMapName()
        local skyshards = EHMShards[ zone ]
        if not skyshards then
                return
        end

        for _,shard in pairs(skyshards) do
                if EHMNotFound(zone, shard[1], shard[2]) then
                        g_mapPinManager:CreatePin( _G["skyshard"], { shard[1], shard[2] }, shard[1], shard[2] )
                end
        end
end

local function Old_EHMSkyshardCallback( g_mapPinManager )
        local zone = GetMapName()
        local skyshards = EH.savedVars["skyshard"].data[zone]
        if not skyshards then
                return
        end
        for _,shard in pairs(skyshards) do
                g_mapPinManager:CreatePin( _G["skyshard"], { shard[1], shard[2] }, shard[1], shard[2] )
        end

end

local function EHMHarvestCallback( materialId, g_mapPinManager )
        if not ZO_WorldMap_IsPinGroupShown(EHM.material[materialId].pinType) then
                return
        end
        local zone = GetMapName()
        local harvestNodes = EH.savedVars["harvest"].data[zone]
        if not harvestNodes then
                return
        end
        harvestNodes = harvestNodes[materialId]
        if harvestNodes then
                for _, node in pairs(harvestNodes) do
                        g_mapPinManager:CreatePin( _G[EHM.material[materialId].pinType], { node[1], node[2] }, node[1], node[2] )
                end
        end
end

function EHMFindShard(mapName, x, y)
        if not EHM.foundShards.zones[ mapName ] then
                EHM.foundShards.zones[ mapName ] = {}
        end
        local list = EHM.foundShards.zones[ mapName ]
        --if  not (list[ #list ][1] == x and list[ #list ][2] == y) then
        list[ #list + 1 ] = { x, y }
        --end
end

EHM.Log = EH.Log
EHM.LogCheck = EH.LogCheck

function EH.Log( type, nodes, ... )
        EHM.Log( type, nodes, ... )
        if type == "harvest" then
                EHM.MapPins:RefreshPins( EHM.material[nodes[2]].pinType )
        elseif type == "skyshard" then
                EHM.MapPins:RefreshPins( "skyshard" )
                EHM.MapPins:RefreshPins( "found_skyshard" )
        end
end

function EH.LogCheck( type, nodes, x, y, ... )
        local result = EHM.LogCheck( type, nodes, x, y )
        if type == "skyshard" then
                SetMapToPlayerLocation()
                local mapName = GetMapName()
                local mapType = GetMapType()
                local playerX, playerY = GetMapPlayerPosition( "player" )
                EHMFindShard(mapName, playerX, playerY)
                while mapType == MAPTYPE_SUBZONE do --if inside a dungeon
                        if MapZoomOut() ~= SET_MAP_RESULT_MAP_CHANGED then --go back
                                break
                        end
                        mapType = GetMapType()
                end
                if mapType == MAPTYPE_ZONE then
                        mapName = GetMapName()
                        playerX, playerY = GetMapPlayerPosition( "player" )
                        EHMFindShard(mapName, playerX, playerY)
                end
        end
        return result
end

local function EHMPinSize(input)
        local category, size = zo_strsplit(" ", input)
        size = tonumber(size)
        if category == nil or size == nil or size < 16 or size > 64 or not (category == "skyshard" or category == "chest" or category == "harvest")  then
                d("/pinsize [category] [size]")
                d("[category]: skyshard, chest, harvest")
                d("[size]: between 16 and 64")
                d("example: /pinsize harvest 32")
                return
        end
        if  category == "harvest" then
                for _, pinType in pairs( EHM.material ) do
                        if EHM.layouts[ pinType.pinType ] then
                                EHM.layouts[ pinType.pinType ].size = size
                        end
                end
        else
                EHM.layouts[category].size = size
        end
        EHM.MapPins:RefreshPins()
end

local function EHMOnLoad(eventCode, addOnName )
        if addOnName ~= "EsoheadMarkers" then
                return
        end

        SLASH_COMMANDS["/pinsize"] = EHMPinSize

        EHM.foundShards = ZO_SavedVars:New("EsoheadMarkers_SavedVariables", 1, "skyshard", { zones = {} })
        EHM.layouts = ZO_SavedVars:New("EsoheadMarkers_SavedVariables", 1, "layout")

        EHMInitSkyshards()
        EHM.MapPins = CustomMapPins:New()
        --
        if not EHM.layouts["skyshard"] then
                EHM.layouts["skyshard"] = { level = 20, texture = EHM["skyshard"], size = 40 }
        end
        EHM.MapPins:CreatePinType( "skyshard",
                EHM.layouts["skyshard"],
                { creator = function(pin)
                        local str
                        if EHM.debug then
                                str = "Mark this Skyshard as collected!"
                        else
                                str = "Uncollected Skyshard"
                        end
                        InformationTooltip:AddLine(str) end,
                        tooltip = InformationTooltip },
                EHMSkyshardCallback
        )

        if not EHM.layouts["found_skyshard"] then
                EHM.layouts["found_skyshard"] = { level = 20, texture = EHM["skyshard"], size = 32 }
        end
        EHM.MapPins:CreatePinType( "found_skyshard",
                EHM.layouts["found_skyshard"],
                { creator = function(pin)
                        local str
                        if EHM.debug then
                                str = "Mark this Skyshard as uncollected!"
                        else
                                str = "Collected Skyshard"
                        end
                        InformationTooltip:AddLine(str) end,
                        tooltip = InformationTooltip },
                EHMFoundSkyshardCallback
        )

        if not EHM.layouts["chest"] then
                EHM.layouts["chest"] = { level = 20, texture = EHM["chest"], size = 32 }
        end
        EHM.MapPins:CreatePinType( "chest",
                EHM.layouts["chest"],
                "Chest",
                EHMChestCallback
        )

        for id, material in pairs( EHM.material ) do
                if id ~= 5 then --not sure how to handle provision
                        local i = id
                        local t = material.texture
                        local s = material.size
                        if not EHM.layouts[material.pinType] then
                                EHM.layouts[material.pinType] = { level = 20, texture = t, size = s }
                        end
                        EHM.MapPins:CreatePinType( material.pinType,
                                EHM.layouts[material.pinType],
                                material.tooltip,
                                function(g_mapPinManager)
                                EHMHarvestCallback( i, g_mapPinManager )
                                end
                        )
                end
        end

        EHMInitializeDebug()
        EHMInitializeCompass()

        EHMInitializeFilters()

        EHM.MapPins:RefreshPins()
end

EVENT_MANAGER:RegisterForEvent("EsoheadMarkers", EVENT_ADD_ON_LOADED, EHMOnLoad)

Compare with Previous | Blame