• 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 Login.lua - Completed some quest

Nekiro

Legendary OT User
TFS Developer
Joined
Sep 7, 2015
Messages
2,686
Solutions
127
Reaction score
2,134
Hello how to add player storage value to complete missions or complete whole quest on login for all players?

I have this:
Code:
player:setStorageValue(Storage.TheNewFrontier.Questline, 28) -- Set questline
    player:setStorageValue(Storage.TheNewFrontier.Mission01, 3) -- Mission01
    player:setStorageValue(Storage.TheNewFrontier.Mission02, 6) -- Mission02
    player:setStorageValue(Storage.TheNewFrontier.Mission03, 3) -- Mission03
    player:setStorageValue(Storage.TheNewFrontier.Mission04, 2) -- Mission04
    player:setStorageValue(Storage.TheNewFrontier.Mission05, 7) -- Mission05
    player:setStorageValue(Storage.TheNewFrontier.Mission06, 3) -- Mission06
    player:setStorageValue(Storage.TheNewFrontier.Mission07, 3) -- Mission07
    player:setStorageValue(Storage.TheNewFrontier.Mission08, 2) -- Mission08
      player:setStorageValue(Storage.TheNewFrontier.Mission09, 3) -- Mission09
    player:setStorageValue(Storage.TheNewFrontier.Mission10, 1) -- Mission10
    player:setStorageValue(Storage.TheNewFrontier.TomeofKnowledge, 13) -- TomeofKnowledge
    player:setStorageValue(Storage.TheNewFrontier.Beaver1, 1) -- Beaver1
    player:setStorageValue(Storage.TheNewFrontier.Beaver2, 1) -- Beaver2
    player:setStorageValue(Storage.TheNewFrontier.Beaver3, 1) -- Beaver3
    player:setStorageValue(Storage.TheNewFrontier.BribeKing, 1) -- BribeKing
    player:setStorageValue(Storage.TheNewFrontier.BribeLeeland, 1) -- BribeLeeland
    player:setStorageValue(Storage.TheNewFrontier.BribeExplorerSociety, 1) -- BribeExplorerSociety
    player:setStorageValue(Storage.TheNewFrontier.BribeWydrin, 1) -- BribeWydrin
    player:setStorageValue(Storage.TheNewFrontier.BribeTelas, 1) -- BribeTelas
    player:setStorageValue(Storage.TheNewFrontier.BribeHumgolf, 1) -- BribeHumgolf

But when i insert this in login.lua in creature scripts it dont work, its doing nothing :/
 
To make it clean and speed up things, i whould done something like this:

Code:
local questStorages = {
    {storage = Storage.TheNewFrontier.BribeKing, value = 1},
    {storage = Storage.TheNewFrontier.BribeLeeland, value = 1},
    {storage = Storage.TheNewFrontier.BribeExplorerSociety, value = 1}
}

local addStorage = Player.setStorageValue
for i = 1, #questStorages do
    addStorage(player, questStorages[i].storage, questStorages[i].value)
end
 
And this will complete whole new frontier quest? When i insert this into login.lua?

And show in quest log? ;d
 
Code:
local questStorages = {
    {storage = Storage.TheNewFrontier.Questline, value = 28},
    {storage = Storage.TheNewFrontier.Mission01, value = 3},
    {storage = Storage.TheNewFrontier.Mission02, value = 6},
    {storage = Storage.TheNewFrontier.Mission03, value = 3},
    {storage = Storage.TheNewFrontier.Mission04, value = 2},
    {storage = Storage.TheNewFrontier.Mission05, value = 7},
    {storage = Storage.TheNewFrontier.Mission06, value = 3},
    {storage = Storage.TheNewFrontier.Mission07, value = 3},
    {storage = Storage.TheNewFrontier.Mission09, value = 3},
    {storage = Storage.TheNewFrontier.Mission10, value = 1},
    {storage = Storage.TheNewFrontier.TomeofKnowledge, value = 13},
    {storage = Storage.TheNewFrontier.Beaver1, value = 1},
    {storage = Storage.TheNewFrontier.Beaver2, value = 1},
    {storage = Storage.TheNewFrontier.Beaver3, value = 1},
    {storage = Storage.TheNewFrontier.BribeKing, value = 1},
    {storage = Storage.TheNewFrontier.BribeLeeland, value = 1},
    {storage = Storage.TheNewFrontier.BribeExplorerSociety, value = 1} -- 17 storage
    {storage = Storage.TheNewFrontier.BribeWydrin, value = 1} -- 18 storage
    }
   

    local addStorage = Player.setStorageValue
    for i = 1, #questStorages do
    addStorage(player, questStorages[i].storage, questStorages[i].value)
end

ba6eda97d7b9a9334fc18fb4ffca19c1.png


When i add more than 17 storages.
 
post whole login.lua

I see there is a missing comma on end of this line:
{storage = Storage.TheNewFrontier.BribeExplorerSociety, value = 1}, -- 17 storage

But i would like to see how you put it on the login.lua
 
hmm its working now.

Like that:
Code:
function onLogin(player)
    local loginStr = "Welcome to " .. configManager.getString(configKeys.SERVER_NAME) .. "! Check avaliable command at: !commands"
    if player:getLastLoginSaved() <= 0 then
        loginStr = loginStr .. " Please choose your outfit."
        player:sendOutfitWindow()
    else
        if loginStr ~= "" then
            player:sendTextMessage(MESSAGE_STATUS_DEFAULT, loginStr)
        end

        loginStr = string.format("Your last visit was on %s.", os.date("%a %b %d %X %Y", player:getLastLoginSaved()))
    end
    player:sendTextMessage(MESSAGE_STATUS_DEFAULT, loginStr)

    -- Stamina
    nextUseStaminaTime[player.uid] = 0
  
  
    -- Completed Quests
    local questStorages = {
    {storage = Storage.TheNewFrontier.Questline, value = 28},
    {storage = Storage.TheNewFrontier.Mission01, value = 3},
    {storage = Storage.TheNewFrontier.Mission02, value = 6},
    {storage = Storage.TheNewFrontier.Mission03, value = 3},
    {storage = Storage.TheNewFrontier.Mission04, value = 2},
    {storage = Storage.TheNewFrontier.Mission05, value = 7},
    {storage = Storage.TheNewFrontier.Mission06, value = 3},
    {storage = Storage.TheNewFrontier.Mission07, value = 3},
    {storage = Storage.TheNewFrontier.Mission09, value = 3},
    {storage = Storage.TheNewFrontier.Mission10, value = 1},
    {storage = Storage.TheNewFrontier.TomeofKnowledge, value = 13},
    {storage = Storage.TheNewFrontier.Beaver1, value = 1},
    {storage = Storage.TheNewFrontier.Beaver2, value = 1},
    {storage = Storage.TheNewFrontier.Beaver3, value = 1},
    {storage = Storage.TheNewFrontier.BribeKing, value = 1},
    {storage = Storage.TheNewFrontier.BribeLeeland, value = 1},
    {storage = Storage.TheNewFrontier.BribeExplorerSociety, value = 1},
    {storage = Storage.TheNewFrontier.BribeWyrdin, value = 1},
    {storage = Storage.TheNewFrontier.BribeTelas, value = 1},
    {storage = Storage.TheNewFrontier.BribeHumgolf, value = 1}
    }
  
    local addStorage = Player.setStorageValue
    for i = 1, #questStorages do
    addStorage(player, questStorages[i].storage, questStorages[i].value)
end
  
  
    -- Promotion
    local vocation = player:getVocation()
    local promotion = vocation:getPromotion()
    if player:isPremium() then
        local value = player:getStorageValue(STORAGEVALUE_PROMOTION)
        if not promotion and value ~= 1 then
            player:setStorageValue(STORAGEVALUE_PROMOTION, 1)
        elseif value == 1 then
            player:setVocation(promotion)
        end
    elseif not promotion then
        player:setVocation(vocation:getDemotion())
    end
  
  
    -- Events
    player:registerEvent("PlayerDeath")
    player:registerEvent("DropLoot")
    return true
end

Should be good right?
 
I recommend to put a table outsdie the function:

Code:
local questStorages = {
    {storage = Storage.TheNewFrontier.Questline, value = 28},
    {storage = Storage.TheNewFrontier.Mission01, value = 3},
    {storage = Storage.TheNewFrontier.Mission02, value = 6},
    {storage = Storage.TheNewFrontier.Mission03, value = 3},
    {storage = Storage.TheNewFrontier.Mission04, value = 2},
    {storage = Storage.TheNewFrontier.Mission05, value = 7},
    {storage = Storage.TheNewFrontier.Mission06, value = 3},
    {storage = Storage.TheNewFrontier.Mission07, value = 3},
    {storage = Storage.TheNewFrontier.Mission09, value = 3},
    {storage = Storage.TheNewFrontier.Mission10, value = 1},
    {storage = Storage.TheNewFrontier.TomeofKnowledge, value = 13},
    {storage = Storage.TheNewFrontier.Beaver1, value = 1},
    {storage = Storage.TheNewFrontier.Beaver2, value = 1},
    {storage = Storage.TheNewFrontier.Beaver3, value = 1},
    {storage = Storage.TheNewFrontier.BribeKing, value = 1},
    {storage = Storage.TheNewFrontier.BribeLeeland, value = 1},
    {storage = Storage.TheNewFrontier.BribeExplorerSociety, value = 1},
    {storage = Storage.TheNewFrontier.BribeWyrdin, value = 1},
    {storage = Storage.TheNewFrontier.BribeTelas, value = 1},
    {storage = Storage.TheNewFrontier.BribeHumgolf, value = 1}
}

function onLogin(player)
    local loginStr = "Welcome to " .. configManager.getString(configKeys.SERVER_NAME) .. "! Check avaliable command at: !commands"
    if player:getLastLoginSaved() <= 0 then
        loginStr = loginStr .. " Please choose your outfit."
        player:sendOutfitWindow()
    else
        if loginStr ~= "" then
            player:sendTextMessage(MESSAGE_STATUS_DEFAULT, loginStr)
        end

        loginStr = string.format("Your last visit was on %s.", os.date("%a %b %d %X %Y", player:getLastLoginSaved()))
    end
    player:sendTextMessage(MESSAGE_STATUS_DEFAULT, loginStr)

    -- Stamina
    nextUseStaminaTime[player.uid] = 0
   
    -- Promotion
    local vocation = player:getVocation()
    local promotion = vocation:getPromotion()
    if player:isPremium() then
        local value = player:getStorageValue(STORAGEVALUE_PROMOTION)
        if not promotion and value ~= 1 then
            player:setStorageValue(STORAGEVALUE_PROMOTION, 1)
        elseif value == 1 then
            player:setVocation(promotion)
        end
    elseif not promotion then
        player:setVocation(vocation:getDemotion())
    end
   
    -- Completed Quests
    local addStorage = Player.setStorageValue
    for i = 1, #questStorages do
        addStorage(player, questStorages[i].storage, questStorages[i].value)
    end
   
    -- Events
    player:registerEvent("PlayerDeath")
    player:registerEvent("DropLoot")
    return true
end
 
Okay, seems like it dont work, because i inserted player send message to check if the script is executing and nothing happened my questlog is empty too.
Do you know why?
Code:
 local addStorage = Player.setStorageValue
    for i = 1, #questStorages do
        addStorage(player, questStorages[i].storage, questStorages[i].value)
          player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'New Frontier unlocked!')
    end
 
I recommend to put a table outsdie the function:

Code:
local questStorages = {
    {storage = Storage.TheNewFrontier.Questline, value = 28},
    {storage = Storage.TheNewFrontier.Mission01, value = 3},
    {storage = Storage.TheNewFrontier.Mission02, value = 6},
    {storage = Storage.TheNewFrontier.Mission03, value = 3},
    {storage = Storage.TheNewFrontier.Mission04, value = 2},
    {storage = Storage.TheNewFrontier.Mission05, value = 7},
    {storage = Storage.TheNewFrontier.Mission06, value = 3},
    {storage = Storage.TheNewFrontier.Mission07, value = 3},
    {storage = Storage.TheNewFrontier.Mission09, value = 3},
    {storage = Storage.TheNewFrontier.Mission10, value = 1},
    {storage = Storage.TheNewFrontier.TomeofKnowledge, value = 13},
    {storage = Storage.TheNewFrontier.Beaver1, value = 1},
    {storage = Storage.TheNewFrontier.Beaver2, value = 1},
    {storage = Storage.TheNewFrontier.Beaver3, value = 1},
    {storage = Storage.TheNewFrontier.BribeKing, value = 1},
    {storage = Storage.TheNewFrontier.BribeLeeland, value = 1},
    {storage = Storage.TheNewFrontier.BribeExplorerSociety, value = 1},
    {storage = Storage.TheNewFrontier.BribeWyrdin, value = 1},
    {storage = Storage.TheNewFrontier.BribeTelas, value = 1},
    {storage = Storage.TheNewFrontier.BribeHumgolf, value = 1}
}

function onLogin(player)
    local loginStr = "Welcome to " .. configManager.getString(configKeys.SERVER_NAME) .. "! Check avaliable command at: !commands"
    if player:getLastLoginSaved() <= 0 then
        loginStr = loginStr .. " Please choose your outfit."
        player:sendOutfitWindow()
    else
        if loginStr ~= "" then
            player:sendTextMessage(MESSAGE_STATUS_DEFAULT, loginStr)
        end

        loginStr = string.format("Your last visit was on %s.", os.date("%a %b %d %X %Y", player:getLastLoginSaved()))
    end
    player:sendTextMessage(MESSAGE_STATUS_DEFAULT, loginStr)

    -- Stamina
    nextUseStaminaTime[player.uid] = 0
  
    -- Promotion
    local vocation = player:getVocation()
    local promotion = vocation:getPromotion()
    if player:isPremium() then
        local value = player:getStorageValue(STORAGEVALUE_PROMOTION)
        if not promotion and value ~= 1 then
            player:setStorageValue(STORAGEVALUE_PROMOTION, 1)
        elseif value == 1 then
            player:setVocation(promotion)
        end
    elseif not promotion then
        player:setVocation(vocation:getDemotion())
    end
  
    -- Completed Quests
    local addStorage = Player.setStorageValue
    for i = 1, #questStorages do
        addStorage(player, questStorages[i].storage, questStorages[i].value)
    end
  
    -- Events
    player:registerEvent("PlayerDeath")
    player:registerEvent("DropLoot")
    return true
end
Hey Printer, this kinda isn't related to this topic, however, I'm curious why you would suggest to put the "variables" outside of the function? What's the benefits & disadvantages of doing this compared to putting it inside the function? I'm just curious, I enjoy learning!

Benefits: The "variables" (e.g. array) is stored in memory so it's quicker to access?
Disadvantages: Always in the memory even when not in use (uses more memory)?

These are my guesses, however, I could be totally wrong!

Thanks in advance!
 
You should compare your questlog to the quest.xml, so you can know what storage you are missing or is not completed.
 
Hey Printer, this kinda isn't related to this topic, however, I'm curious why you would suggest to put the "variables" outside of the function? What's the benefits & disadvantages of doing this compared to putting it inside the function? I'm just curious, I enjoy learning!

Benefits: The "variables" (e.g. array) is stored in memory so it's quicker to access?
Disadvantages: Always in the memory even when not in use (uses more memory)?

These are my guesses, however, I could be totally wrong!

Thanks in advance!
When it is inside the scope, it will create a new variable in every frame it won't be too bad, but what if that frame needs to call your function tens of thousands times? Then you will accumulate a lot of variables until the garbage collector finally kicks in. But i do it mostly for code readability.
 
I took a stab at this but it seems he's still not seeing any change - nothing happens:

Code:
        local t = {
                {12130, 28},
                {12131, 3},
        --[[
                {Storage.TheNewFrontier.Questline, 28},
                {Storage.TheNewFrontier.Mission01, 3},
                {Storage.TheNewFrontier.Mission02, 6},
                {Storage.TheNewFrontier.Mission03, 3},
                {Storage.TheNewFrontier.Mission04, 2},
                {Storage.TheNewFrontier.Mission05, 7},
                {Storage.TheNewFrontier.Mission06, 3},
                {Storage.TheNewFrontier.Mission07, 3},
                {Storage.TheNewFrontier.Mission09, 3},
                {Storage.TheNewFrontier.Mission10},
                {Storage.TheNewFrontier.TomeofKnowledge, 12},
                {Storage.TheNewFrontier.Beaver1},
                {Storage.TheNewFrontier.Beaver2},
                {Storage.TheNewFrontier.Beaver3},
                {Storage.TheNewFrontier.BribeKing},
                {Storage.TheNewFrontier.BribeLeeland},
                {Storage.TheNewFrontier.BribeExplorerSociety},
                {Storage.TheNewFrontier.BribeWyrdin},
                {Storage.TheNewFrontier.BribeTelas},
                {Storage.TheNewFrontier.BribeHumgolf}
        ]]
        }
        for i = 1, #t do
                local k = player:getStorageValue(i[1])
                if (k < 1 or (i[2] ~= nil and k ~= i[2])) then
                        player:setStorageValue(i[1], i[2] and i[2] or 1)
                end
        end

Sorry I couldn't figure it out. Maybe I'm missing something... Good luck.
 
Last edited:
Back
Top