Back to Home

ESO Lua File v101041

ingame/crafting/craftingcreateslotanimation.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
ZO_CraftingCreateSlotAnimation = ZO_CraftingSlotAnimationBase:Subclass()
function ZO_CraftingCreateSlotAnimation:New(...)
    return ZO_CraftingSlotAnimationBase.New(self, ...)
end
function ZO_CraftingCreateSlotAnimation:Initialize(sceneName, visibilityPredicate)
    ZO_CraftingSlotAnimationBase.Initialize(self, sceneName, visibilityPredicate)
    self.bursts = {}
end
do
    local g_burstPool
    function AcquireSlotBurst()
        if not g_burstPool then
            local function Factory(objectPool)
                local burst = ZO_ObjectPool_CreateControl("ZO_CraftingLockInBurst", objectPool, GuiRoot)
                burst.lockAnimation = ANIMATION_MANAGER:CreateTimelineFromVirtual("CraftingLockInAnimation", burst)
                burst.unlockAnimation = ANIMATION_MANAGER:CreateTimelineFromVirtual("CraftingUnlockAnimation", burst)
                burst.unlockAnimation:SetHandler("OnStop", function() objectPool:ReleaseObject(burst.key) end)
                return burst
            end
            g_burstPool = ZO_ObjectPool:New(Factory)
        end
        local burst, key = g_burstPool:AcquireObject()
        burst.key = key
        return burst
    end
    function ReleaseSlotBurst(burst)
        burst.lockAnimation:Stop()
        burst.unlockAnimation:PlayFromStart()
    end
end
function ZO_CraftingCreateSlotAnimation:GetLockInSound(slot)
    -- Intended to be overriden for custom sounds
    return SOUNDS.CRAFTING_CREATE_SLOT_ANIMATED
end
function ZO_CraftingCreateSlotAnimation:GetAnimationOffset(slot)
    -- Intended to be overriden for custom offsets
    return 200
end
local TOTAL_SLOT_LENGTH_MS = 800
local MIN_LENGTH_PER_SLOT = 200
local MAX_LENGTH_PER_SLOT = 250
local function GetSlotControl(slot)
    if type(slot) == "userdata" then
        return slot
    end
    return slot:GetControl()
end
function ZO_CraftingCreateSlotAnimation:Play(sceneName)
    ClearMenu()
    local offset = 0
    local numSlotsAnimating = 0
    for i, slot in ipairs(self.slots) do
        if slot.HasItem == nil or slot:HasItem() then
            numSlotsAnimating = numSlotsAnimating + 1
        end
    end
    local durationPerSlot = zo_clamp(TOTAL_SLOT_LENGTH_MS / numSlotsAnimating, MIN_LENGTH_PER_SLOT, MAX_LENGTH_PER_SLOT)
    for i, slot in ipairs(self.slots) do
        if slot.HasItem == nil or slot:HasItem() then
            local burst = AcquireSlotBurst()
            local slotControl = GetSlotControl(slot)
            local icon = slotControl:GetNamedChild("Icon")
            ZO_InventorySlot_HandleInventoryUpdate(slotControl)
            burst:SetParent(icon)
            burst:SetAnchor(CENTER, nil, CENTER)
            for animationIndex = 1, burst.lockAnimation:GetNumAnimations() do
                local animation = burst.lockAnimation:GetAnimation(animationIndex)
                animation:SetDuration(durationPerSlot)
                burst.lockAnimation:SetAnimationOffset(animation, offset)
            end
            offset = offset + self:GetAnimationOffset(slot)
        
            burst.lockAnimation:GetLastAnimation():SetAnimatedControl(icon)
            burst.unlockAnimation:GetLastAnimation():SetAnimatedControl(icon)
            burst.lockAnimation.lockInSound = self:GetLockInSound(slot)
            burst.lockAnimation:PlayFromStart()
        
            self.bursts[burst] = true
        end
    end
end
function ZO_CraftingCreateSlotAnimation:Stop(sceneName)
    for burst in pairs(self.bursts) do
        ReleaseSlotBurst(burst)
        self.bursts[burst] = nil
    end
end