• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Lua Problem creating a Modal Window

Dbzl

New Member
Joined
Jan 22, 2017
Messages
34
Reaction score
1
As requested, I created this thread to explain better my problem, outside the lib's thread.

The lib I'm using on this code is: [TFS 1.2] Modal Window Helper Lib

The code, till this moment, is:
Code:
local window = 0
local window2v2 = 0
local window2v2_info = 0
local window3v3 = 0
local window3v3_info = 0

function createWindows(player, name)

    window = ModalWindow {
       title = "Arena Window",
       message = "Please choose the PVP mode below:"
    }

    window2v2 = ModalWindow {
       title = "2v2 Window",
       message = "Please choose a 2v2 option below:"
    }

    window3v3 = ModalWindow {
       title = "3v3 Window",
       message = "Please choose a 3v3 option below:"
    }

    window2v2_info = ModalWindow {
       title = "2v2 Player Info",
       message = ""
    }

    window3v3_info = ModalWindow {
       title = "3v3 Player Info",
       message = ""
    }

    window:addChoice("2v2")
    window:addChoice("3v3")

    window2v2:addChoice("Join 2v2 Queue")
    window2v2:addChoice("Player Info")

    window3v3:addChoice("Join 3v3 Queue")
    window3v3:addChoice("Player Info")

    window2v2_info.title = player:getName().. "'s info"
    window2v2_info:addChoice("Total Games: ".. name)
    window2v2_info:addChoice("Win Rate: ".. player_modal_save[player:getId()].name)
    window2v2_info:addChoice("Elo Points: ")
    window2v2_info:addChoice("Total Medals: ")

    window3v3_info.title = player:getName().. "'s info"
    window3v3_info:addChoice("Total Games: 0")
    window3v3_info:addChoice("Win Rate: 0%")
    window3v3_info:addChoice("Elo Points: 0")
    window3v3_info:addChoice("Total Medals: 0")

    -- Main Window
    window:addButton("Select",
       function(button, choice)
            if choice.text == "2v2" then
                window2v2:sendToPlayer(player)
            elseif choice.text == "3v3" then
                window3v3:sendToPlayer(player)
           end
       end
    )
    window:setDefaultEnterButton("Select")
    window:addButton('Close')
    window:setDefaultEscapeButton('Close')

    -- 2v2 Window
    window2v2:addButton("Select",
       function(button, choice)
            if choice.text == "Join Queue" then
            elseif choice.text == "Player Info" then
                window2v2_info:sendToPlayer(player)
           end
       end
    )
    window2v2:setDefaultEnterButton("Select")
    window2v2:addButton('Ranking')
    window2v2:addButton("Back",
       function(button, choice)
            window:sendToPlayer(player)
       end
    )
    window2v2:setDefaultEscapeButton('Back')

    -- 3v3 Window
    window3v3:addButton("Select",
       function(button, choice)
            if choice.text == "Join Queue" then
            elseif choice.text == "Player Info" then
                window3v3_info:sendToPlayer(player)
           end
       end
    )
    window3v3:setDefaultEnterButton("Select")
    window3v3:addButton("Ranking")
    window3v3:addButton("Back",
       function(button, choice)
            window:sendToPlayer(player)
       end
    )
    window3v3:setDefaultEscapeButton("Back")

    -- 2v2 Info Window
    window2v2_info:addButton("Select",
       function(button, choice)
            print(player:getName())
            window2v2_info:sendToPlayer(player)
       end
    )
    window2v2_info:setDefaultEnterButton("Select")
    window2v2_info:addButton("Back",
       function(button, choice)
            window2v2:sendToPlayer(player)
       end
    )
    window2v2_info:setDefaultEscapeButton("Back")

    -- 3v3 Info Window
    window3v3_info:addButton("Select",
       function(button, choice)
            window3v3_info:sendToPlayer(player)
       end
    )
    window3v3_info:setDefaultEnterButton("Select")
    window3v3_info:addButton("Back",
       function(button, choice)
            window3v3:sendToPlayer(player)
       end
    )
    window3v3_info:setDefaultEscapeButton("Back")
    return true
end

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    if player_modal_save[player:getId()] == nil then
        player_modal_save[player:getId()] = {}
    end

    player_modal_save[player:getId()].name = player:getName()

    createWindows(player, player:getName())
    window:sendToPlayer(player)
    return true
end
Please don't puke on the code, I'm still working on it, just gotta make everything work firstly q_q

The problem is as described on this post:
[TFS 1.2] Modal Window Helper Lib

May anyone, please, help me figure it out? D:
 
Solution
As requested, I created this thread to explain better my problem, outside the lib's thread.

The lib I'm using on this code is: [TFS 1.2] Modal Window Helper Lib

The code, till this moment, is:
Code:
local window = 0
local window2v2 = 0
local window2v2_info = 0
local window3v3 = 0
local window3v3_info = 0

function createWindows(player, name)

    window = ModalWindow {
       title = "Arena Window",
       message = "Please choose the PVP mode below:"
    }

    window2v2 = ModalWindow {
       title = "2v2 Window",
       message = "Please choose a 2v2 option below:"
    }

    window3v3 = ModalWindow {
       title = "3v3 Window",
       message = "Please choose a 3v3 option below:"
    }

    window2v2_info = ModalWindow {...
As requested, I created this thread to explain better my problem, outside the lib's thread.

The lib I'm using on this code is: [TFS 1.2] Modal Window Helper Lib

The code, till this moment, is:
Code:
local window = 0
local window2v2 = 0
local window2v2_info = 0
local window3v3 = 0
local window3v3_info = 0

function createWindows(player, name)

    window = ModalWindow {
       title = "Arena Window",
       message = "Please choose the PVP mode below:"
    }

    window2v2 = ModalWindow {
       title = "2v2 Window",
       message = "Please choose a 2v2 option below:"
    }

    window3v3 = ModalWindow {
       title = "3v3 Window",
       message = "Please choose a 3v3 option below:"
    }

    window2v2_info = ModalWindow {
       title = "2v2 Player Info",
       message = ""
    }

    window3v3_info = ModalWindow {
       title = "3v3 Player Info",
       message = ""
    }

    window:addChoice("2v2")
    window:addChoice("3v3")

    window2v2:addChoice("Join 2v2 Queue")
    window2v2:addChoice("Player Info")

    window3v3:addChoice("Join 3v3 Queue")
    window3v3:addChoice("Player Info")

    window2v2_info.title = player:getName().. "'s info"
    window2v2_info:addChoice("Total Games: ".. name)
    window2v2_info:addChoice("Win Rate: ".. player_modal_save[player:getId()].name)
    window2v2_info:addChoice("Elo Points: ")
    window2v2_info:addChoice("Total Medals: ")

    window3v3_info.title = player:getName().. "'s info"
    window3v3_info:addChoice("Total Games: 0")
    window3v3_info:addChoice("Win Rate: 0%")
    window3v3_info:addChoice("Elo Points: 0")
    window3v3_info:addChoice("Total Medals: 0")

    -- Main Window
    window:addButton("Select",
       function(button, choice)
            if choice.text == "2v2" then
                window2v2:sendToPlayer(player)
            elseif choice.text == "3v3" then
                window3v3:sendToPlayer(player)
           end
       end
    )
    window:setDefaultEnterButton("Select")
    window:addButton('Close')
    window:setDefaultEscapeButton('Close')

    -- 2v2 Window
    window2v2:addButton("Select",
       function(button, choice)
            if choice.text == "Join Queue" then
            elseif choice.text == "Player Info" then
                window2v2_info:sendToPlayer(player)
           end
       end
    )
    window2v2:setDefaultEnterButton("Select")
    window2v2:addButton('Ranking')
    window2v2:addButton("Back",
       function(button, choice)
            window:sendToPlayer(player)
       end
    )
    window2v2:setDefaultEscapeButton('Back')

    -- 3v3 Window
    window3v3:addButton("Select",
       function(button, choice)
            if choice.text == "Join Queue" then
            elseif choice.text == "Player Info" then
                window3v3_info:sendToPlayer(player)
           end
       end
    )
    window3v3:setDefaultEnterButton("Select")
    window3v3:addButton("Ranking")
    window3v3:addButton("Back",
       function(button, choice)
            window:sendToPlayer(player)
       end
    )
    window3v3:setDefaultEscapeButton("Back")

    -- 2v2 Info Window
    window2v2_info:addButton("Select",
       function(button, choice)
            print(player:getName())
            window2v2_info:sendToPlayer(player)
       end
    )
    window2v2_info:setDefaultEnterButton("Select")
    window2v2_info:addButton("Back",
       function(button, choice)
            window2v2:sendToPlayer(player)
       end
    )
    window2v2_info:setDefaultEscapeButton("Back")

    -- 3v3 Info Window
    window3v3_info:addButton("Select",
       function(button, choice)
            window3v3_info:sendToPlayer(player)
       end
    )
    window3v3_info:setDefaultEnterButton("Select")
    window3v3_info:addButton("Back",
       function(button, choice)
            window3v3:sendToPlayer(player)
       end
    )
    window3v3_info:setDefaultEscapeButton("Back")
    return true
end

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    if player_modal_save[player:getId()] == nil then
        player_modal_save[player:getId()] = {}
    end

    player_modal_save[player:getId()].name = player:getName()

    createWindows(player, player:getName())
    window:sendToPlayer(player)
    return true
end
Please don't puke on the code, I'm still working on it, just gotta make everything work firstly q_q

The problem is as described on this post:
[TFS 1.2] Modal Window Helper Lib

May anyone, please, help me figure it out? D:
The problem is that you are using global variables, you should use them as local so the functions that you create inside it use the variables as upvalues not global variables.

You don't need to create the window to send it after, you may send it inside the function.

Try this, I placed some comments for you.
Lua:
function Player:sendArenaWindows()

    -- If you don't put local, the functions that you use these values are going to be affected by subsequent calls cause the variables are global.
    -- You have to use local so the functions you define inside here use them as upvalue instead
    local window = ModalWindow {
       title = "Arena Window",
       message = "Please choose the PVP mode below:"
    }

    local window2v2 = ModalWindow {
       title = "2v2 Window",
       message = "Please choose a 2v2 option below:"
    }

    local window3v3 = ModalWindow {
       title = "3v3 Window",
       message = "Please choose a 3v3 option below:"
    }

    local window2v2_info = ModalWindow {
       title = "2v2 Player Info",
       message = ""
    }

    local window3v3_info = ModalWindow {
       title = "3v3 Player Info",
       message = ""
    }

    window:addChoice("2v2")
    window:addChoice("3v3")

    window2v2:addChoice("Join 2v2 Queue")
    window2v2:addChoice("Player Info")

    window3v3:addChoice("Join 3v3 Queue")
    window3v3:addChoice("Player Info")

    window2v2_info.title = self:getName().. "'s info"
    window2v2_info:addChoice("Total Games: ".. name)
    -- I don't see why this would be a table, why not just a storage? Well think about it.
    window2v2_info:addChoice("Win Rate: ".. player_modal_save[self:getId()].name)
    window2v2_info:addChoice("Elo Points: ")
    window2v2_info:addChoice("Total Medals: ")

    window3v3_info.title = self:getName().. "'s info"
    window3v3_info:addChoice("Total Games: 0")
    window3v3_info:addChoice("Win Rate: 0%")
    window3v3_info:addChoice("Elo Points: 0")
    window3v3_info:addChoice("Total Medals: 0")

    local playerId = self:getId()
    -- Main Window
    window:addButton("Select",
        function(button, choice)
            -- That's what I meant by not assuming that the player userdata upvalue is valid.
            local player = Player(playerId)
            if player then
                if choice.text == "2v2" then
                    window2v2:sendToPlayer(player)
                elseif choice.text == "3v3" then
                    window3v3:sendToPlayer(player)
                end
            end
        end
    )
    window:setDefaultEnterButton("Select")
    window:addButton('Close')
    window:setDefaultEscapeButton('Close')

    -- 2v2 Window
    window2v2:addButton("Select",
        function(button, choice)
            local player = Player(playerId)
            if player then
                if choice.text == "Join Queue" then
                elseif choice.text == "Player Info" then
                    window2v2_info:sendToPlayer(player)
                end
            end
       end
    )
    window2v2:setDefaultEnterButton("Select")
    window2v2:addButton('Ranking')
    window2v2:addButton("Back",
        function(button, choice)
            local player = Player(playerId)
            if player then
                window:sendToPlayer(player)
            end
        end
    )
    window2v2:setDefaultEscapeButton('Back')

    -- 3v3 Window
    window3v3:addButton("Select",
        function(button, choice)
            local player = Player(playerId)
            if player then
                if choice.text == "Join Queue" then
                elseif choice.text == "Player Info" then
                    window3v3_info:sendToPlayer(player)
                end
            end
        end
    )
    window3v3:setDefaultEnterButton("Select")
    window3v3:addButton("Ranking")
    window3v3:addButton("Back",
        function(button, choice)
            local player = Player(playerId)
            if player then
                window:sendToPlayer(player)
            end
        end
    )
    window3v3:setDefaultEscapeButton("Back")

    -- 2v2 Info Window
    window2v2_info:addButton("Select",
        function(button, choice)
            local player = Player(playerId)
            if player then
                window2v2_info:sendToPlayer(player)
            end
        end
    )
    window2v2_info:setDefaultEnterButton("Select")
    window2v2_info:addButton("Back",
        function(button, choice)
            local player = Player(playerId)
            if player then
                window2v2:sendToPlayer(player)
            end
        end
    )
    window2v2_info:setDefaultEscapeButton("Back")

    -- 3v3 Info Window
    window3v3_info:addButton("Select",
        function(button, choice)
            local player = Player(playerId)
            if player then
                window3v3_info:sendToPlayer(player)
            end
        end
    )
    window3v3_info:setDefaultEnterButton("Select")
    window3v3_info:addButton("Back",
        function(button, choice)
            local player = Player(playerId)
            if player then
                window3v3:sendToPlayer(player)
            end
        end
    )
    window3v3_info:setDefaultEscapeButton("Back")
   
    window:sendToPlayer(self)
    return true
end

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    player:sendArenaWindows()
    return true
end
 
Solution
The problem is that you are using global variables, you should use them as local so the functions that you create inside it use the variables as upvalues not global variables.

You don't need to create the window to send it after, you may send it inside the function.

Try this, I placed some comments for you.
Lua:
function Player:sendArenaWindows()

    -- If you don't put local, the functions that you use these values are going to be affected by subsequent calls cause the variables are global.
    -- You have to use local so the functions you define inside here use them as upvalue instead
    local window = ModalWindow {
       title = "Arena Window",
       message = "Please choose the PVP mode below:"
    }

    local window2v2 = ModalWindow {
       title = "2v2 Window",
       message = "Please choose a 2v2 option below:"
    }

    local window3v3 = ModalWindow {
       title = "3v3 Window",
       message = "Please choose a 3v3 option below:"
    }

    local window2v2_info = ModalWindow {
       title = "2v2 Player Info",
       message = ""
    }

    local window3v3_info = ModalWindow {
       title = "3v3 Player Info",
       message = ""
    }

    window:addChoice("2v2")
    window:addChoice("3v3")

    window2v2:addChoice("Join 2v2 Queue")
    window2v2:addChoice("Player Info")

    window3v3:addChoice("Join 3v3 Queue")
    window3v3:addChoice("Player Info")

    window2v2_info.title = self:getName().. "'s info"
    window2v2_info:addChoice("Total Games: ".. name)
    -- I don't see why this would be a table, why not just a storage? Well think about it.
    window2v2_info:addChoice("Win Rate: ".. player_modal_save[self:getId()].name)
    window2v2_info:addChoice("Elo Points: ")
    window2v2_info:addChoice("Total Medals: ")

    window3v3_info.title = self:getName().. "'s info"
    window3v3_info:addChoice("Total Games: 0")
    window3v3_info:addChoice("Win Rate: 0%")
    window3v3_info:addChoice("Elo Points: 0")
    window3v3_info:addChoice("Total Medals: 0")

    local playerId = self:getId()
    -- Main Window
    window:addButton("Select",
        function(button, choice)
            -- That's what I meant by not assuming that the player userdata upvalue is valid.
            local player = Player(playerId)
            if player then
                if choice.text == "2v2" then
                    window2v2:sendToPlayer(player)
                elseif choice.text == "3v3" then
                    window3v3:sendToPlayer(player)
                end
            end
        end
    )
    window:setDefaultEnterButton("Select")
    window:addButton('Close')
    window:setDefaultEscapeButton('Close')

    -- 2v2 Window
    window2v2:addButton("Select",
        function(button, choice)
            local player = Player(playerId)
            if player then
                if choice.text == "Join Queue" then
                elseif choice.text == "Player Info" then
                    window2v2_info:sendToPlayer(player)
                end
            end
       end
    )
    window2v2:setDefaultEnterButton("Select")
    window2v2:addButton('Ranking')
    window2v2:addButton("Back",
        function(button, choice)
            local player = Player(playerId)
            if player then
                window:sendToPlayer(player)
            end
        end
    )
    window2v2:setDefaultEscapeButton('Back')

    -- 3v3 Window
    window3v3:addButton("Select",
        function(button, choice)
            local player = Player(playerId)
            if player then
                if choice.text == "Join Queue" then
                elseif choice.text == "Player Info" then
                    window3v3_info:sendToPlayer(player)
                end
            end
        end
    )
    window3v3:setDefaultEnterButton("Select")
    window3v3:addButton("Ranking")
    window3v3:addButton("Back",
        function(button, choice)
            local player = Player(playerId)
            if player then
                window:sendToPlayer(player)
            end
        end
    )
    window3v3:setDefaultEscapeButton("Back")

    -- 2v2 Info Window
    window2v2_info:addButton("Select",
        function(button, choice)
            local player = Player(playerId)
            if player then
                window2v2_info:sendToPlayer(player)
            end
        end
    )
    window2v2_info:setDefaultEnterButton("Select")
    window2v2_info:addButton("Back",
        function(button, choice)
            local player = Player(playerId)
            if player then
                window2v2:sendToPlayer(player)
            end
        end
    )
    window2v2_info:setDefaultEscapeButton("Back")

    -- 3v3 Info Window
    window3v3_info:addButton("Select",
        function(button, choice)
            local player = Player(playerId)
            if player then
                window3v3_info:sendToPlayer(player)
            end
        end
    )
    window3v3_info:setDefaultEnterButton("Select")
    window3v3_info:addButton("Back",
        function(button, choice)
            local player = Player(playerId)
            if player then
                window3v3:sendToPlayer(player)
            end
        end
    )
    window3v3_info:setDefaultEscapeButton("Back")
 
    window:sendToPlayer(self)
    return true
end

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    player:sendArenaWindows()
    return true
end
Holy shit. My problem was using global variables?
And you even fixed the code and commented it?
Wow!
I just read your code and then mine. It does make sense what you said!
Thank you very much. I just tested as you told it was supposed to be and it worked.
<3
 
Back
Top