ESOUI SVN ItemLock

[/] [trunk/] [ItemLock.lua] - Blame information for rev 3

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)