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) |