Details | Compare with Previous | View Log
Line No. | Rev | Author | Line |
---|---|---|---|
1 | 2 | saykoaddon-6731 | --[[ |
2 | saykoaddon-6731 | *********************************************************************************** |
|
3 | saykoaddon-6731 | Copyright (c) 2014, saykoaddon |
|
4 | saykoaddon-6731 | All rights reserved. |
|
5 | saykoaddon-6731 | ||
6 | saykoaddon-6731 | Redistribution and use in source and binary forms, with or without |
|
7 | saykoaddon-6731 | modification, are permitted provided that the following conditions are met: |
|
8 | saykoaddon-6731 | ||
9 | saykoaddon-6731 | [1] Redistributions of source code must retain the above copyright notice, |
|
10 | saykoaddon-6731 | this list of conditions and the following disclaimer. |
|
11 | saykoaddon-6731 | ||
12 | saykoaddon-6731 | [2] Redistributions in binary form must reproduce the above copyright notice, |
|
13 | saykoaddon-6731 | this list of conditions and the following disclaimer in the documentation |
|
14 | saykoaddon-6731 | and/or other materials provided with the distribution. |
|
15 | saykoaddon-6731 | ||
16 | saykoaddon-6731 | [3] Neither the name of the copyright holder nor the names of its contributors |
|
17 | saykoaddon-6731 | may be used to endorse or promote products derived from this software without |
|
18 | saykoaddon-6731 | specific prior written permission. |
|
19 | saykoaddon-6731 | ||
20 | saykoaddon-6731 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
|
21 | saykoaddon-6731 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
|
22 | saykoaddon-6731 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
|
23 | saykoaddon-6731 | IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
|
24 | saykoaddon-6731 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
|
25 | saykoaddon-6731 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
26 | saykoaddon-6731 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
|
27 | saykoaddon-6731 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
28 | saykoaddon-6731 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|
29 | saykoaddon-6731 | POSSIBILITY OF SUCH DAMAGE. |
|
30 | saykoaddon-6731 | *********************************************************************************** |
|
31 | saykoaddon-6731 | ]] |
|
32 | saykoaddon-6731 | ||
33 | saykoaddon-6731 | ------- ItemLock Class ---------------------- |
|
34 | saykoaddon-6731 | ItemLock = ZO_Object:Subclass() |
|
35 | 3 | saykoaddon-6731 | local DECONSTRUCTION_BAG = ZO_SmithingTopLevelDeconstructionPanelInventoryBackpackContents |
36 | 2 | saykoaddon-6731 | |
37 | saykoaddon-6731 | -- Creates variables |
|
38 | saykoaddon-6731 | function ItemLock:New() |
|
39 | saykoaddon-6731 | ItemLock.name = "ItemLock" |
|
40 | 3 | saykoaddon-6731 | ItemLock.version = 2 |
41 | saykoaddon-6731 | ItemLock.eventHandlers = {} |
|
42 | 2 | saykoaddon-6731 | ItemLock.list = ZO_SavedVars:New(ItemLock.name .. "_SavedVariables", 1, "list", {}, nil) |
43 | 3 | saykoaddon-6731 | ItemLock.settings = ZO_SavedVars:New(ItemLock.name .. "_SavedVariables", 1, "settings", { isActive = true }, nil) |
44 | saykoaddon-6731 | ||
45 | saykoaddon-6731 | ItemLock.settings.isActive = true -- <= REMOVE THIS LINE TO KEEP SETTINGS BETWEEN SESSIONS |
|
46 | 2 | saykoaddon-6731 | end |
47 | saykoaddon-6731 | ||
48 | saykoaddon-6731 | -- Initializes event handlers and chat commands |
|
49 | saykoaddon-6731 | function ItemLock:Init() |
|
50 | 3 | saykoaddon-6731 | EVENT_MANAGER:RegisterForEvent( ItemLock.name .. "_OnInventorySlotLocked", EVENT_INVENTORY_SLOT_LOCKED, ItemLock_OnInventorySlotLocked ) |
51 | 2 | saykoaddon-6731 | ZO_CreateStringId("SI_BINDING_NAME_ITEM_LOCK_TOGGLE_ENABLE", "Enable/Disable") |
52 | saykoaddon-6731 | ZO_CreateStringId("SI_BINDING_NAME_ITEM_LOCK_TOGGLE_LOCK", "Lock/Unlock") |
|
53 | saykoaddon-6731 | SLASH_COMMANDS["/itemlock"] = ItemLock.ToggleEnable |
|
54 | 3 | saykoaddon-6731 | |
55 | saykoaddon-6731 | -- override event handlers of DECONSTRUCTION_BAG, it is used to update item controls' event handlers |
|
56 | saykoaddon-6731 | ItemLock:PreHookHandler( "OnEffectivelyShown", DECONSTRUCTION_BAG, ItemLock_DECONSTRUCTION_BAG_OnEffectivelyShown ) |
|
57 | saykoaddon-6731 | ItemLock:PreHookHandler( "OnMouseWheel", DECONSTRUCTION_BAG, ItemLock_DECONSTRUCTION_BAG_OnMouseWheel ) |
|
58 | 2 | saykoaddon-6731 | end |
59 | saykoaddon-6731 | ||
60 | saykoaddon-6731 | -- activates item protection |
|
61 | saykoaddon-6731 | function ItemLock:Activate() |
|
62 | 3 | saykoaddon-6731 | ItemLock.settings.isActive = true |
63 | 2 | saykoaddon-6731 | CHAT_SYSTEM:AddMessage( ItemLock.name .. " is on") |
64 | saykoaddon-6731 | end |
|
65 | saykoaddon-6731 | ||
66 | saykoaddon-6731 | -- deactivates item protection |
|
67 | saykoaddon-6731 | function ItemLock:Deactivate() |
|
68 | 3 | saykoaddon-6731 | ItemLock.settings.isActive = false |
69 | 2 | saykoaddon-6731 | CHAT_SYSTEM:AddMessage( ItemLock.name .. " is off") |
70 | saykoaddon-6731 | end |
|
71 | saykoaddon-6731 | ||
72 | saykoaddon-6731 | -- returns protection status |
|
73 | saykoaddon-6731 | function ItemLock:IsActive() |
|
74 | 3 | saykoaddon-6731 | return ItemLock.settings.isActive |
75 | 2 | saykoaddon-6731 | end |
76 | saykoaddon-6731 | ||
77 | saykoaddon-6731 | -- toggles item protection |
|
78 | saykoaddon-6731 | function ItemLock:ToggleEnable() |
|
79 | saykoaddon-6731 | if (ItemLock:IsActive()) then |
|
80 | saykoaddon-6731 | ItemLock:Deactivate() |
|
81 | saykoaddon-6731 | else |
|
82 | saykoaddon-6731 | ItemLock:Activate() |
|
83 | saykoaddon-6731 | end |
|
84 | saykoaddon-6731 | end |
|
85 | saykoaddon-6731 | ||
86 | saykoaddon-6731 | -- checks if item is in protection list |
|
87 | saykoaddon-6731 | function ItemLock:IsItemLocked(itemId) |
|
88 | saykoaddon-6731 | return itemId and ItemLock.list[itemId] |
|
89 | saykoaddon-6731 | end |
|
90 | saykoaddon-6731 | ||
91 | saykoaddon-6731 | -- adds item to protection list |
|
92 | saykoaddon-6731 | function ItemLock:LockItem(itemId) |
|
93 | saykoaddon-6731 | if( not itemId ) then return end |
|
94 | saykoaddon-6731 | ItemLock.list[itemId] = 1 |
|
95 | saykoaddon-6731 | end |
|
96 | saykoaddon-6731 | ||
97 | saykoaddon-6731 | -- removes item from protection list |
|
98 | saykoaddon-6731 | function ItemLock:UnlockItem(itemId) |
|
99 | saykoaddon-6731 | if( not itemId ) then return end |
|
100 | saykoaddon-6731 | ItemLock.list[itemId] = nil |
|
101 | saykoaddon-6731 | end |
|
102 | saykoaddon-6731 | ||
103 | saykoaddon-6731 | -- toggles item's protection status by manipulating protection list |
|
104 | saykoaddon-6731 | function ItemLock:ToggleLock() |
|
105 | saykoaddon-6731 | local control = WINDOW_MANAGER:GetMouseOverControl() |
|
106 | saykoaddon-6731 | ||
107 | saykoaddon-6731 | -- make sure control contains an item |
|
108 | saykoaddon-6731 | if( not control or not control.dataEntry or not control.dataEntry.data ) then return nil end |
|
109 | saykoaddon-6731 | ||
110 | saykoaddon-6731 | local bag = control.dataEntry.data.bagId |
|
111 | saykoaddon-6731 | local slot = control.dataEntry.data.slotIndex |
|
112 | saykoaddon-6731 | ||
113 | saykoaddon-6731 | -- make sure control contains an item |
|
114 | saykoaddon-6731 | if( not bag or not slot ) then return nil end |
|
115 | saykoaddon-6731 | ||
116 | saykoaddon-6731 | -- get instance id of the item, this value is persistant across all game and sessions |
|
117 | saykoaddon-6731 | local id = GetItemInstanceId(bag, slot) |
|
118 | saykoaddon-6731 | ||
119 | saykoaddon-6731 | if( not id ) then return nil end |
|
120 | saykoaddon-6731 | ||
121 | saykoaddon-6731 | -- convert to string to prevent negative number error of saved vars |
|
122 | saykoaddon-6731 | local idStr = tostring(id) |
|
123 | saykoaddon-6731 | ||
124 | saykoaddon-6731 | -- check if item is in the protection list |
|
125 | saykoaddon-6731 | if( ItemLock:IsItemLocked(idStr) ) then |
|
126 | saykoaddon-6731 | ItemLock:UnlockItem(idStr) |
|
127 | saykoaddon-6731 | CHAT_SYSTEM:AddMessage( GetItemLink(bag, slot, LINK_STYLE_BRACKETS) .. " has been unlocked") |
|
128 | saykoaddon-6731 | else |
|
129 | saykoaddon-6731 | ItemLock:LockItem(idStr) |
|
130 | saykoaddon-6731 | CHAT_SYSTEM:AddMessage( GetItemLink(bag, slot, LINK_STYLE_BRACKETS) .. " has been locked") |
|
131 | saykoaddon-6731 | end |
|
132 | saykoaddon-6731 | ||
133 | saykoaddon-6731 | end |
|
134 | saykoaddon-6731 | ||
135 | saykoaddon-6731 | -- warns user with a chat message |
|
136 | saykoaddon-6731 | function ItemLock:WarnUser(bag, slot) |
|
137 | saykoaddon-6731 | CHAT_SYSTEM:AddMessage( "WARNING!!!!" ) |
|
138 | saykoaddon-6731 | CHAT_SYSTEM:AddMessage( "You are trying to deconstruct a locked item" ) |
|
139 | saykoaddon-6731 | CHAT_SYSTEM:AddMessage( "Item: " .. GetItemLink(bag, slot, LINK_STYLE_BRACKETS) ) |
|
140 | saykoaddon-6731 | end |
|
141 | saykoaddon-6731 | ||
142 | saykoaddon-6731 | -- fired when user selects an item to deconstruct |
|
143 | saykoaddon-6731 | -- warns user if the item is in protection list |
|
144 | saykoaddon-6731 | function ItemLock:DeconstructionSelectionHandler(bag, slot) |
|
145 | saykoaddon-6731 | ||
146 | 3 | saykoaddon-6731 | -- make sure user is on deconstruction panel |
147 | saykoaddon-6731 | if( not DECONSTRUCTION_BAG or DECONSTRUCTION_BAG:IsHidden() ) then return nil end |
|
148 | saykoaddon-6731 | ||
149 | saykoaddon-6731 | -- if not active then abort checking |
|
150 | saykoaddon-6731 | if( not ItemLock:IsActive() ) then return nil end |
|
151 | saykoaddon-6731 | ||
152 | 2 | saykoaddon-6731 | -- get instance id of the item, this value is persistant across all game |
153 | saykoaddon-6731 | local id = GetItemInstanceId(bag, slot) |
|
154 | saykoaddon-6731 | ||
155 | saykoaddon-6731 | -- convert to string to prevent negative number error of saved vars |
|
156 | saykoaddon-6731 | local idStr = tostring(id) |
|
157 | saykoaddon-6731 | ||
158 | 3 | saykoaddon-6731 | -- if item is in protection list, warn user |
159 | 2 | saykoaddon-6731 | if( ItemLock:IsItemLocked(idStr) ) then |
160 | saykoaddon-6731 | ItemLock:WarnUser(bag, slot) |
|
161 | 3 | saykoaddon-6731 | return true |
162 | 2 | saykoaddon-6731 | end |
163 | 3 | saykoaddon-6731 | |
164 | saykoaddon-6731 | return false |
|
165 | 2 | saykoaddon-6731 | end |
166 | saykoaddon-6731 | ||
167 | 3 | saykoaddon-6731 | -- gets handler from the event handler list |
168 | saykoaddon-6731 | function ItemLock:GetEventHandler(eventName, objName) |
|
169 | saykoaddon-6731 | if( not ItemLock.eventHandlers or not ItemLock.eventHandlers[eventName] ) then return nil end |
|
170 | saykoaddon-6731 | return ItemLock.eventHandlers[eventName][objName] |
|
171 | saykoaddon-6731 | end |
|
172 | 2 | saykoaddon-6731 | |
173 | 3 | saykoaddon-6731 | -- adds handler to the event handler list |
174 | saykoaddon-6731 | function ItemLock:SetEventHandler(eventName, objName, handler) |
|
175 | saykoaddon-6731 | if ( not ItemLock.eventHandlers[eventName] ) then ItemLock.eventHandlers[eventName] = {} end |
|
176 | saykoaddon-6731 | ItemLock.eventHandlers[eventName][objName] = handler |
|
177 | saykoaddon-6731 | end |
|
178 | 2 | saykoaddon-6731 | |
179 | 3 | saykoaddon-6731 | -- puts given handler in front of the event handler of given object |
180 | saykoaddon-6731 | function ItemLock:PreHookHandler(eventName, control, handler) |
|
181 | saykoaddon-6731 | ItemLock:SetEventHandler(eventName, control:GetName(), control:GetHandler(eventName) ) |
|
182 | saykoaddon-6731 | control:SetHandler(eventName, handler) |
|
183 | saykoaddon-6731 | end |
|
184 | saykoaddon-6731 | ||
185 | saykoaddon-6731 | ----------------------------------------- |
|
186 | saykoaddon-6731 | ||
187 | saykoaddon-6731 | -- EVENT HANDLER FUNCTIONS ----- |
|
188 | saykoaddon-6731 | ||
189 | saykoaddon-6731 | -- handler function for inventory item controls' OnMouseDoubleClick event |
|
190 | saykoaddon-6731 | function ItemLock_InventoryItem_OnMouseDoubleClick(self, ...) |
|
191 | 2 | saykoaddon-6731 | |
192 | 3 | saykoaddon-6731 | -- make sure control contains an item |
193 | saykoaddon-6731 | if( self and self.dataEntry and self.dataEntry.data ) then |
|
194 | saykoaddon-6731 | local bag = self.dataEntry.data.bagId |
|
195 | saykoaddon-6731 | local slot = self.dataEntry.data.slotIndex |
|
196 | saykoaddon-6731 | ||
197 | saykoaddon-6731 | if( bag and slot ) then |
|
198 | saykoaddon-6731 | -- check if deconstruction is forbidden |
|
199 | saykoaddon-6731 | -- if so, return false to prevent selection of the item |
|
200 | saykoaddon-6731 | if( ItemLock:DeconstructionSelectionHandler(bag, slot) ) then return false end |
|
201 | saykoaddon-6731 | end |
|
202 | saykoaddon-6731 | end |
|
203 | 2 | saykoaddon-6731 | |
204 | 3 | saykoaddon-6731 | -- call the original handler function |
205 | saykoaddon-6731 | local func = ItemLock:GetEventHandler("OnMouseDoubleClick", self:GetName()) |
|
206 | saykoaddon-6731 | if ( not func ) then return false end |
|
207 | saykoaddon-6731 | ||
208 | saykoaddon-6731 | return func(self, ...) |
|
209 | 2 | saykoaddon-6731 | end |
210 | saykoaddon-6731 | ||
211 | 3 | saykoaddon-6731 | -- handler function for EVENT_INVENTORY_SLOT_LOCKED global event |
212 | saykoaddon-6731 | function ItemLock_OnInventorySlotLocked(self, bag, slot) |
|
213 | saykoaddon-6731 | -- check if deconstruction is forbidden |
|
214 | saykoaddon-6731 | -- if so, clear item hold by cursor |
|
215 | saykoaddon-6731 | if( ItemLock:DeconstructionSelectionHandler(bag, slot) ) then ClearCursor() end |
|
216 | saykoaddon-6731 | end |
|
217 | 2 | saykoaddon-6731 | |
218 | 3 | saykoaddon-6731 | -- handler function for decontruction bag's OnEffectivelyShown event |
219 | saykoaddon-6731 | function ItemLock_DECONSTRUCTION_BAG_OnEffectivelyShown(self, ...) |
|
220 | saykoaddon-6731 | ||
221 | saykoaddon-6731 | if ( not self ) then return false end |
|
222 | saykoaddon-6731 | ||
223 | saykoaddon-6731 | for i = 1, self:GetNumChildren() do |
|
224 | saykoaddon-6731 | -- override OnMouseDoubleClick event of inventory item controls |
|
225 | saykoaddon-6731 | if( self:GetChild(i):GetHandler("OnMouseDoubleClick") ~= ItemLock_InventoryItem_OnMouseDoubleClick ) then |
|
226 | saykoaddon-6731 | ItemLock:PreHookHandler( "OnMouseDoubleClick", self:GetChild(i), ItemLock_InventoryItem_OnMouseDoubleClick ) |
|
227 | saykoaddon-6731 | end |
|
228 | saykoaddon-6731 | end |
|
229 | saykoaddon-6731 | ||
230 | saykoaddon-6731 | -- call the original handler function |
|
231 | saykoaddon-6731 | local func = ItemLock:GetEventHandler("OnEffectivelyShown", self:GetName()) |
|
232 | saykoaddon-6731 | if ( not func ) then return false end |
|
233 | saykoaddon-6731 | ||
234 | saykoaddon-6731 | return func(self, ...) |
|
235 | saykoaddon-6731 | end |
|
236 | saykoaddon-6731 | ||
237 | saykoaddon-6731 | -- handler function for decontruction bag's OnMouseWheel event |
|
238 | saykoaddon-6731 | function ItemLock_DECONSTRUCTION_BAG_OnMouseWheel(self, ...) |
|
239 | saykoaddon-6731 | ||
240 | saykoaddon-6731 | if ( not self ) then return false end |
|
241 | saykoaddon-6731 | ||
242 | saykoaddon-6731 | for i = 1, self:GetNumChildren() do |
|
243 | saykoaddon-6731 | -- override OnMouseDoubleClick event of inventory item controls |
|
244 | saykoaddon-6731 | if( self:GetChild(i):GetHandler("OnMouseDoubleClick") ~= ItemLock_InventoryItem_OnMouseDoubleClick ) then |
|
245 | saykoaddon-6731 | ItemLock:PreHookHandler( "OnMouseDoubleClick", self:GetChild(i), ItemLock_InventoryItem_OnMouseDoubleClick ) |
|
246 | saykoaddon-6731 | end |
|
247 | saykoaddon-6731 | end |
|
248 | saykoaddon-6731 | ||
249 | saykoaddon-6731 | -- call the original handler function |
|
250 | saykoaddon-6731 | local func = ItemLock:GetEventHandler("OnMouseWheel", self:GetName()) |
|
251 | saykoaddon-6731 | if ( not func ) then return false end |
|
252 | saykoaddon-6731 | ||
253 | saykoaddon-6731 | return func(self, ...) |
|
254 | saykoaddon-6731 | end |
|
255 | saykoaddon-6731 | ----------------------------------------- |
|
256 | saykoaddon-6731 | ||
257 | 2 | saykoaddon-6731 | ------- Entry Point ---------------- |
258 | saykoaddon-6731 | local function OnAddOnLoaded(eventCode, addOnName) |
|
259 | saykoaddon-6731 | if (addOnName ~= "ItemLock") then |
|
260 | saykoaddon-6731 | return |
|
261 | saykoaddon-6731 | end |
|
262 | saykoaddon-6731 | ||
263 | saykoaddon-6731 | -- create and initialize variables |
|
264 | saykoaddon-6731 | ItemLock:New() |
|
265 | saykoaddon-6731 | ItemLock:Init() |
|
266 | saykoaddon-6731 | end |
|
267 | saykoaddon-6731 | ||
268 | saykoaddon-6731 | ------- Entry Point Register -------- |
|
269 | saykoaddon-6731 | EVENT_MANAGER:RegisterForEvent("Event_ItemLock_Loaded", EVENT_ADD_ON_LOADED, OnAddOnLoaded) |