ESOUI SVN EsoHeadMarkers

[/] [trunk/] [EsoheadMarkers/] [EsoheadMarkers.lua] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 Shinni-694
EHM = {
2 Shinni-694
        ["skyshard"]    = "EsoUI/Art/Inventory/inventory_tabicon_quest_up.dds",
3 Shinni-694
        ["chest"] = "EsoUI/Art/Inventory/inventory_tabicon_misc_up.dds"
4 Shinni-694
        }
5 Shinni-694
EHM.material = {
6 Shinni-694
        {pinType = "mining", texture = "EsoUI/Art/MapPins/AvA_mine_Neutral.dds", tooltip = "Ore", size = 20 },
7 Shinni-694
        {pinType = "clothing", texture = "EsoUI/Art/Characterwindow/gearslot_tabard.dds", tooltip = "Clothing Material", size = 20 },
8 Shinni-694
        {pinType = "rune", texture = "EsoUI/Art/Crafting/enchantment_tabicon_essence_down.dds", tooltip = "Runestone", size = 20 },
9 Shinni-694
        {pinType = "alchemy", texture = "EsoUI/Art/Crafting/alchemy_tabicon_reagent_down.dds", tooltip = "Alchemy Ingredient", size = 20 },
10 Shinni-694
        {pinType = "provisioning", texture = "EsoheadMarkers/clothing.dds", tooltip = "Provision Material", size = 20 },
11 Shinni-694
        {pinType = "wood", texture = "EsoUI/Art/MapPins/AvA_lumbermill_Neutral.dds", tooltip = "Wood", size = 20 }
12 Shinni-694
}
13 Shinni-694
 
14 Shinni-694
EHM.layouts = {}
15 Shinni-694
 
16 Shinni-694
local function EHMChestCallback( g_mapPinManager )
17 Shinni-694
        if not ZO_WorldMap_IsPinGroupShown("chest") then
18 Shinni-694
                return
19 Shinni-694
        end
20 Shinni-694
        local zone = GetMapName()
21 Shinni-694
        local chests = EH.savedVars["chest"].data[zone]
22 Shinni-694
        if not chests then
23 Shinni-694
                return
24 Shinni-694
        end
25 Shinni-694
        for _,chest in pairs(chests) do
26 Shinni-694
                g_mapPinManager:CreatePin( _G["chest"], { chest[1], chest[2] }, chest[1], chest[2] )
27 Shinni-694
        end
28 Shinni-694
 
29 Shinni-694
end
30 Shinni-694
 
31 Shinni-694
function EHMNotFound( zone, x, y)
32 Shinni-694
        local foundShards = EHM.foundShards.zones[ zone ]
33 Shinni-694
        local minFound, minShard
34 Shinni-694
        local minDist = math.huge
35 Shinni-694
 
36 Shinni-694
        if not foundShards then
37 Shinni-694
                return true
38 Shinni-694
        end
39 Shinni-694
 
40 Shinni-694
        --get closest already collected shard
41 Shinni-694
        for _, shard in pairs( foundShards ) do
42 Shinni-694
                if zo_abs(shard[1] - x) + zo_abs(shard[2] - y) < minDist then
43 Shinni-694
                        minFound = shard
44 Shinni-694
                        minDist = zo_abs(shard[1] - x) + zo_abs(shard[2] - y)
45 Shinni-694
                end
46 Shinni-694
        end
47 Shinni-694
 
48 Shinni-694
        if not minFound then
49 Shinni-694
                return true
50 Shinni-694
        end
51 Shinni-694
 
52 Shinni-694
        --get closest shard
53 Shinni-694
        minDist = math.huge
54 Shinni-694
 
55 Shinni-694
        for _, shard in pairs( EHMShards[ zone ] ) do
56 Shinni-694
                if zo_abs(shard[1] - minFound[1]) + zo_abs(shard[2] - minFound[2]) < minDist then
57 Shinni-694
                        minShard = shard
58 Shinni-694
                        minDist = zo_abs(shard[1] - minFound[1]) + zo_abs(shard[2] - minFound[2])
59 Shinni-694
                end
60 Shinni-694
        end
61 Shinni-694
 
62 Shinni-694
        if not minShard then
63 Shinni-694
                return true
64 Shinni-694
        end
65 Shinni-694
        -- if current shard and closest shard are the same, it is already collected
66 Shinni-694
        return not (minShard[1] == x and minShard[2] == y)
67 Shinni-694
end
68 Shinni-694
 
69 Shinni-694
local function EHMFoundSkyshardCallback( g_mapPinManager )
70 Shinni-694
        if not ZO_WorldMap_IsPinGroupShown("found_skyshard") then
71 Shinni-694
                return
72 Shinni-694
        end
73 Shinni-694
        local zone = GetMapName()
74 Shinni-694
        local skyshards = EHMShards[ zone ]
75 Shinni-694
        if not skyshards then
76 Shinni-694
                return
77 Shinni-694
        end
78 Shinni-694
 
79 Shinni-694
        for _,shard in pairs(skyshards) do
80 Shinni-694
                if not EHMNotFound(zone, shard[1], shard[2]) then
81 Shinni-694
                        g_mapPinManager:CreatePin( _G["found_skyshard"], { shard[1], shard[2] }, shard[1], shard[2] )
82 Shinni-694
                end
83 Shinni-694
        end
84 Shinni-694
end
85 Shinni-694
 
86 Shinni-694
local function EHMSkyshardCallback( g_mapPinManager )
87 Shinni-694
        if not ZO_WorldMap_IsPinGroupShown("skyshard") then
88 Shinni-694
                return
89 Shinni-694
        end
90 Shinni-694
        local zone = GetMapName()
91 Shinni-694
        local skyshards = EHMShards[ zone ]
92 Shinni-694
        if not skyshards then
93 Shinni-694
                return
94 Shinni-694
        end
95 Shinni-694
 
96 Shinni-694
        for _,shard in pairs(skyshards) do
97 Shinni-694
                if EHMNotFound(zone, shard[1], shard[2]) then
98 Shinni-694
                        g_mapPinManager:CreatePin( _G["skyshard"], { shard[1], shard[2] }, shard[1], shard[2] )
99 Shinni-694
                end
100 Shinni-694
        end
101 Shinni-694
end
102 Shinni-694
 
103 Shinni-694
local function Old_EHMSkyshardCallback( g_mapPinManager )
104 Shinni-694
        local zone = GetMapName()
105 Shinni-694
        local skyshards = EH.savedVars["skyshard"].data[zone]
106 Shinni-694
        if not skyshards then
107 Shinni-694
                return
108 Shinni-694
        end
109 Shinni-694
        for _,shard in pairs(skyshards) do
110 Shinni-694
                g_mapPinManager:CreatePin( _G["skyshard"], { shard[1], shard[2] }, shard[1], shard[2] )
111 Shinni-694
        end
112 Shinni-694
 
113 Shinni-694
end
114 Shinni-694
 
115 Shinni-694
local function EHMHarvestCallback( materialId, g_mapPinManager )
116 Shinni-694
        if not ZO_WorldMap_IsPinGroupShown(EHM.material[materialId].pinType) then
117 Shinni-694
                return
118 Shinni-694
        end
119 Shinni-694
        local zone = GetMapName()
120 Shinni-694
        local harvestNodes = EH.savedVars["harvest"].data[zone]
121 Shinni-694
        if not harvestNodes then
122 Shinni-694
                return
123 Shinni-694
        end
124 Shinni-694
        harvestNodes = harvestNodes[materialId]
125 Shinni-694
        if harvestNodes then
126 Shinni-694
                for _, node in pairs(harvestNodes) do
127 Shinni-694
                        g_mapPinManager:CreatePin( _G[EHM.material[materialId].pinType], { node[1], node[2] }, node[1], node[2] )
128 Shinni-694
                end
129 Shinni-694
        end
130 Shinni-694
end
131 Shinni-694
 
132 Shinni-694
function EHMFindShard(mapName, x, y)
133 Shinni-694
        if not EHM.foundShards.zones[ mapName ] then
134 Shinni-694
                EHM.foundShards.zones[ mapName ] = {}
135 Shinni-694
        end
136 Shinni-694
        local list = EHM.foundShards.zones[ mapName ]
137 Shinni-694
        --if  not (list[ #list ][1] == x and list[ #list ][2] == y) then
138 Shinni-694
        list[ #list + 1 ] = { x, y }
139 Shinni-694
        --end
140 Shinni-694
end
141 Shinni-694
 
142 Shinni-694
EHM.Log = EH.Log
143 Shinni-694
EHM.LogCheck = EH.LogCheck
144 Shinni-694
 
145 Shinni-694
function EH.Log( type, nodes, ... )
146 Shinni-694
        EHM.Log( type, nodes, ... )
147 Shinni-694
        if type == "harvest" then
148 Shinni-694
                EHM.MapPins:RefreshPins( EHM.material[nodes[2]].pinType )
149 Shinni-694
        elseif type == "skyshard" then
150 Shinni-694
                EHM.MapPins:RefreshPins( "skyshard" )
151 Shinni-694
                EHM.MapPins:RefreshPins( "found_skyshard" )
152 Shinni-694
        end
153 Shinni-694
end
154 Shinni-694
 
155 Shinni-694
function EH.LogCheck( type, nodes, x, y, ... )
156 Shinni-694
        local result = EHM.LogCheck( type, nodes, x, y )
157 Shinni-694
        if type == "skyshard" then
158 Shinni-694
                SetMapToPlayerLocation()
159 Shinni-694
                local mapName = GetMapName()
160 Shinni-694
                local mapType = GetMapType()
161 Shinni-694
                local playerX, playerY = GetMapPlayerPosition( "player" )
162 Shinni-694
                EHMFindShard(mapName, playerX, playerY)
163 Shinni-694
                while mapType == MAPTYPE_SUBZONE do --if inside a dungeon
164 Shinni-694
                        if MapZoomOut() ~= SET_MAP_RESULT_MAP_CHANGED then --go back
165 Shinni-694
                                break
166 Shinni-694
                        end
167 Shinni-694
                        mapType = GetMapType()
168 Shinni-694
                end
169 Shinni-694
                if mapType == MAPTYPE_ZONE then
170 Shinni-694
                        mapName = GetMapName()
171 Shinni-694
                        playerX, playerY = GetMapPlayerPosition( "player" )
172 Shinni-694
                        EHMFindShard(mapName, playerX, playerY)
173 Shinni-694
                end
174 Shinni-694
        end
175 Shinni-694
        return result
176 Shinni-694
end
177 Shinni-694
 
178 Shinni-694
local function EHMPinSize(input)
179 Shinni-694
        local category, size = zo_strsplit(" ", input)
180 Shinni-694
        size = tonumber(size)
181 Shinni-694
        if category == nil or size == nil or size < 16 or size > 64 or not (category == "skyshard" or category == "chest" or category == "harvest")  then
182 Shinni-694
                d("/pinsize [category] [size]")
183 Shinni-694
                d("[category]: skyshard, chest, harvest")
184 Shinni-694
                d("[size]: between 16 and 64")
185 Shinni-694
                d("example: /pinsize harvest 32")
186 Shinni-694
                return
187 Shinni-694
        end
188 Shinni-694
        if  category == "harvest" then
189 Shinni-694
                for _, pinType in pairs( EHM.material ) do
190 Shinni-694
                        if EHM.layouts[ pinType.pinType ] then
191 Shinni-694
                                EHM.layouts[ pinType.pinType ].size = size
192 Shinni-694
                        end
193 Shinni-694
                end
194 Shinni-694
        else
195 Shinni-694
                EHM.layouts[category].size = size
196 Shinni-694
        end
197 Shinni-694
        EHM.MapPins:RefreshPins()
198 Shinni-694
end
199 Shinni-694
 
200 Shinni-694
local function EHMOnLoad(eventCode, addOnName )
201 Shinni-694
        if addOnName ~= "EsoheadMarkers" then
202 Shinni-694
                return
203 Shinni-694
        end
204 Shinni-694
 
205 Shinni-694
        SLASH_COMMANDS["/pinsize"] = EHMPinSize
206 Shinni-694
 
207 Shinni-694
        EHM.foundShards = ZO_SavedVars:New("EsoheadMarkers_SavedVariables", 1, "skyshard", { zones = {} })
208 Shinni-694
        EHM.layouts = ZO_SavedVars:New("EsoheadMarkers_SavedVariables", 1, "layout")
209 Shinni-694
 
210 Shinni-694
        EHMInitSkyshards()
211 Shinni-694
        EHM.MapPins = CustomMapPins:New()
212 Shinni-694
        --
213 Shinni-694
        if not EHM.layouts["skyshard"] then
214 Shinni-694
                EHM.layouts["skyshard"] = { level = 20, texture = EHM["skyshard"], size = 40 }
215 Shinni-694
        end
216 Shinni-694
        EHM.MapPins:CreatePinType( "skyshard",
217 Shinni-694
                EHM.layouts["skyshard"],
218 Shinni-694
                { creator = function(pin)
219 Shinni-694
                        local str
220 Shinni-694
                        if EHM.debug then
221 Shinni-694
                                str = "Mark this Skyshard as collected!"
222 Shinni-694
                        else
223 Shinni-694
                                str = "Uncollected Skyshard"
224 Shinni-694
                        end
225 Shinni-694
                        InformationTooltip:AddLine(str) end,
226 Shinni-694
                        tooltip = InformationTooltip },
227 Shinni-694
                EHMSkyshardCallback
228 Shinni-694
        )
229 Shinni-694
 
230 Shinni-694
        if not EHM.layouts["found_skyshard"] then
231 Shinni-694
                EHM.layouts["found_skyshard"] = { level = 20, texture = EHM["skyshard"], size = 32 }
232 Shinni-694
        end
233 Shinni-694
        EHM.MapPins:CreatePinType( "found_skyshard",
234 Shinni-694
                EHM.layouts["found_skyshard"],
235 Shinni-694
                { creator = function(pin)
236 Shinni-694
                        local str
237 Shinni-694
                        if EHM.debug then
238 Shinni-694
                                str = "Mark this Skyshard as uncollected!"
239 Shinni-694
                        else
240 Shinni-694
                                str = "Collected Skyshard"
241 Shinni-694
                        end
242 Shinni-694
                        InformationTooltip:AddLine(str) end,
243 Shinni-694
                        tooltip = InformationTooltip },
244 Shinni-694
                EHMFoundSkyshardCallback
245 Shinni-694
        )
246 Shinni-694
 
247 Shinni-694
        if not EHM.layouts["chest"] then
248 Shinni-694
                EHM.layouts["chest"] = { level = 20, texture = EHM["chest"], size = 32 }
249 Shinni-694
        end
250 Shinni-694
        EHM.MapPins:CreatePinType( "chest",
251 Shinni-694
                EHM.layouts["chest"],
252 Shinni-694
                "Chest",
253 Shinni-694
                EHMChestCallback
254 Shinni-694
        )
255 Shinni-694
 
256 Shinni-694
        for id, material in pairs( EHM.material ) do
257 Shinni-694
                if id ~= 5 then --not sure how to handle provision
258 Shinni-694
                        local i = id
259 Shinni-694
                        local t = material.texture
260 Shinni-694
                        local s = material.size
261 Shinni-694
                        if not EHM.layouts[material.pinType] then
262 Shinni-694
                                EHM.layouts[material.pinType] = { level = 20, texture = t, size = s }
263 Shinni-694
                        end
264 Shinni-694
                        EHM.MapPins:CreatePinType( material.pinType,
265 Shinni-694
                                EHM.layouts[material.pinType],
266 Shinni-694
                                material.tooltip,
267 Shinni-694
                                function(g_mapPinManager)
268 Shinni-694
                                EHMHarvestCallback( i, g_mapPinManager )
269 Shinni-694
                                end
270 Shinni-694
                        )
271 Shinni-694
                end
272 Shinni-694
        end
273 Shinni-694
 
274 Shinni-694
        EHMInitializeDebug()
275 Shinni-694
        EHMInitializeCompass()
276 Shinni-694
 
277 Shinni-694
        EHMInitializeFilters()
278 Shinni-694
 
279 Shinni-694
        EHM.MapPins:RefreshPins()
280 Shinni-694
end
281 Shinni-694
 
282 Shinni-694
EVENT_MANAGER:RegisterForEvent("EsoheadMarkers", EVENT_ADD_ON_LOADED, EHMOnLoad)