Back to Home

ESO Lua File v100016

ingame/housingeditor/sharedfurnituremanager.lua

[◄ back to folders ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
ZO_SharedFurnitureManager = ZO_CallbackObject:Subclass()
function ZO_SharedFurnitureManager:New(...)
    local sharedFurnitureManager = ZO_CallbackObject.New(self)
    sharedFurnitureManager:Initialize(...)
    return sharedFurnitureManager
end
function ZO_SharedFurnitureManager:Initialize()
    self.furnitureCache = {}
    SHARED_INVENTORY:RegisterCallback("FullInventoryUpdate", function(bagId) self:OnFullInventoryUpdate(bagId) end)
    SHARED_INVENTORY:RegisterCallback("SingleSlotInventoryUpdate", function(bagId, slotIndex) self:OnSingleSlotInventoryUpdate(bagId, slotIndex) end)
end
ZO_PLACEABLE_TYPE_ITEM = 1
ZO_PLACEABLE_TYPE_COLLECTIBLE = 2
ZO_PLACEABLE_TYPE_TEST = 3
local function PlaceableFurnitureFilter(itemData)
    return itemData.isPlaceableFurniture
end
function ZO_SharedFurnitureManager:OnFullInventoryUpdate(bagId)
end
function ZO_SharedFurnitureManager:OnSingleSlotInventoryUpdate(bagId, slotIndex)
    self:CreateOrUpdateItemDataEntry(bagId, slotIndex)
end
function ZO_SharedFurnitureManager:GetFurnitureCache(type)
    if type == ZO_PLACEABLE_TYPE_TEST and not self.furnitureCache[type] then
        self:CreateTestCache() --lazy init test fixtures
    end  
    if self.furnitureCache[type] then
        return self.furnitureCache[type]
    end
end
function ZO_SharedFurnitureManager:CreateOrUpdateItemCache(bagId)
    if not self.furnitureCache[ZO_PLACEABLE_TYPE_ITEM] then    
        self.furnitureCache[ZO_PLACEABLE_TYPE_ITEM] = {}
    end
    local itemCache = self.furnitureCache[ZO_PLACEABLE_TYPE_ITEM]
    if bagId then
        local bagCache = itemCache[bagId]
        if bagCache then
            ZO_ClearTable(bagCache)
        end
        local filteredDataTable = SHARED_INVENTORY:GenerateFullSlotData(PlaceableFurnitureFilter, bagId)
        for _, itemData in pairs(filteredDataTable) do
            self:CreateOrUpdateItemDataEntry(bagId, itemData.slotIndex)
        end
    end
end
function ZO_SharedFurnitureManager:CreateTestCache()
    if not self.furnitureCache[ZO_PLACEABLE_TYPE_TEST] then    
        self.furnitureCache[ZO_PLACEABLE_TYPE_TEST] = {}
    end
    local numFurniture = DebugGetNumTestFurniture() --JKTODO this is just a bunch of test stuff, we'll kill this once more data exists
    for i = 1, numFurniture do
        self:CreateTestDataEntry(i)
    end
end
function ZO_SharedFurnitureManager:CreateOrUpdateItemDataEntry(bagId, slotIndex)
    local itemCache = self.furnitureCache[ZO_PLACEABLE_TYPE_ITEM]
    local bag = itemCache[bagId]
    if not bag then
        bag = {}
        itemCache[bagId] = bag
    end
    local data = bag[slotIndex]
    local slotData = SHARED_INVENTORY:GenerateSingleSlotData(bagId, slotIndex)
    if slotData then
        if not data then
            data = {}
        end
        data.name = slotData.name
        data.bagId = bagId
        data.slotIndex = slotIndex
        data.type = ZO_PLACEABLE_TYPE_ITEM
        bag[slotIndex] = data
    else
        bag[slotIndex] = nil --the item was removed
    end
end
function ZO_SharedFurnitureManager:CreateTestDataEntry(index)
    local testCache = self.furnitureCache[ZO_PLACEABLE_TYPE_TEST]
    local data = testCache[index]
    if not data then
        data = 
        {
            name="[test]Furniture "..tostring(index),
            index = index,
            type = ZO_PLACEABLE_TYPE_TEST
        }
        testCache[#testCache + 1] = data
    end
    -- no need to ever update the test data, its just hardcoded fixture id's.
end
SHARED_FURNITURE = ZO_SharedFurnitureManager:New()