Back to Home

ESO Lua File v100036

ingame/scenes/interactscene.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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
ZO_InteractScene_Mixin = {}
function ZO_InteractScene_Mixin:InitializeInteractInfo(interactionInfo)
    if not interactionInfo.OnInteractionCanceled then
        -- If the interact ended for reasons outside of our control (i.e.: combat), this scenes state is essentially no longer valid so we need to abort and come back in anyway
        if not interactionInfo.registeredScenes then
            interactionInfo.registeredScenes = {}
        end
        interactionInfo.OnInteractionCanceled = function()
            local currentScene = SCENE_MANAGER:GetCurrentScene()
            if currentScene and currentScene:IsShowing() and interactionInfo.registeredScenes[currentScene] then
                self.sceneManager:RequestShowLeaderBaseScene(ZO_BHSCR_INTERACT_ENDED)
            end
        end
    end
    if interactionInfo.registeredScenes then
        interactionInfo.registeredScenes[self] = true
    end
    self.interactionInfo = interactionInfo
end
function ZO_InteractScene_Mixin:GetInteractionInfo()
    return self.interactionInfo
end
function ZO_InteractScene_Mixin:SetInteractionInfo(interactionInfo)
    self.interactionInfo = interactionInfo
end
function ZO_InteractScene_Mixin:OnRemovedFromQueue(newNextScene)
    if not INTERACT_WINDOW:IsInteracting(self.interactionInfo) then
        RemoveActionLayerByName("SceneChangeInterceptLayer")
        if not (newNextScene and newNextScene.GetInteractionInfo and newNextScene:GetInteractionInfo() == self.interactionInfo) then
            INTERACT_WINDOW:TerminateClientInteraction(self.interactionInfo)
        end
    end
end
function ZO_InteractScene_Mixin:OnSceneShowing()
    INTERACT_WINDOW:OnBeginInteraction(self.interactionInfo)
end
function ZO_InteractScene_Mixin:OnSceneHidden()
    local endInteraction = true
    local nextScene = self.sceneManager:GetNextScene()
    if nextScene then
        if nextScene.GetInteractionInfo ~= nil then
            local nextSceneInteractionInfo = nextScene:GetInteractionInfo()
            local nextSceneInteractTypes = nextSceneInteractionInfo.interactTypes
            -- see if ALL of my scene's interact types will be satisfied by the next scene
            local allTypesMatched = true
            local mySceneInteractTypes = self.interactionInfo.interactTypes
            for i = 1, #mySceneInteractTypes do
                local typeMatch = false
                for j = 1, #nextSceneInteractTypes do
                    if mySceneInteractTypes[i] == nextSceneInteractTypes[j] then
                        typeMatch = true
                        break
                    end
                end
                if not typeMatch then
                    allTypesMatched = false
                    break
                end
            end
            if allTypesMatched then
                endInteraction = false
            end
        end
    end
    if endInteraction then
        INTERACT_WINDOW:EndInteraction(self.interactionInfo)
    end
end
-- Interact Scene --
ZO_InteractScene = ZO_Scene:Subclass()
zo_mixin(ZO_InteractScene, ZO_InteractScene_Mixin)
function ZO_InteractScene:New(...)
    return ZO_Scene.New(self, ...)
end
function ZO_InteractScene:Initialize(name, sceneManager, interactionInfo)
    ZO_Scene.Initialize(self, name, sceneManager)
    self:InitializeInteractInfo(interactionInfo)
end
function ZO_InteractScene:SetState(newState)
    if newState == SCENE_SHOWING then
        self:OnSceneShowing()
    elseif newState == SCENE_HIDDEN then
        self:OnSceneHidden()
    end
    ZO_Scene.SetState(self, newState)
end
-- Remote Interact Scene --
ZO_RemoteInteractScene = ZO_RemoteScene:Subclass()
zo_mixin(ZO_RemoteInteractScene, ZO_InteractScene_Mixin)
function ZO_RemoteInteractScene:New(...)
    return ZO_RemoteScene.New(self, ...)
end
function ZO_RemoteInteractScene:Initialize(name, sceneManager, interactionInfo)
    ZO_RemoteScene.Initialize(self, name, sceneManager)
    self:InitializeInteractInfo(interactionInfo)
end
function ZO_RemoteInteractScene:SetState(newState)
    if newState == SCENE_SHOWING then
        self:OnSceneShowing()
    elseif newState == SCENE_HIDDEN then
        self:OnSceneHidden()
    end
    ZO_RemoteScene.SetState(self, newState)
end