Lua [OTBR] Creaturescripts Login.lua

adrenyslopez

Member
Joined
Dec 22, 2015
Messages
158
Reaction score
10
There is something wrong with this scripts, I wanted to change the base xp gain rate of client 12, so I added this and now it gives me this error

Lua:
    -- Client 12 Bonus Experience
    local clientVersion = self:getClient().version
    if clientVersion >= 1200 then
    local baseExp = 130
    if Game.getStorageValue(GlobalStorage.XpDisplayMode) > 0 then
        baseExp = getRateFromTable(experienceStages, player:getLevel(), configManager.getNumber(configKeys.RATE_EXP))
    end

ERROR
Code:
Lua Script Error: [Scripts Interface]
/home/forgottenserver/data/scripts/creaturescripts/others/login.lua:callback
...ttenserver/data/scripts/creaturescripts/others/login.lua:192: attempt to index global 'self' (a nil value)
stack traceback:
        [C]: in function '__index'
        ...ttenserver/data/scripts/creaturescripts/others/login.lua:192: in function <...ttenserver/data/scripts/creaturescripts/others/login.lua:23>
GM Krotus has logged out. | Client: 12.61
GM Krotus has logged in. | Client: 11

Lua Script Error: [Scripts Interface]
/home/forgottenserver/data/scripts/creaturescripts/others/login.lua:callback
...ttenserver/data/scripts/creaturescripts/others/login.lua:192: attempt to index global 'self' (a nil value)
stack traceback:
        [C]: in function '__index'
        ...ttenserver/data/scripts/creaturescripts/others/login.lua:192: in function <...ttenserver/data/scripts/creaturescripts/others/login.lua:23>
GM Krotus has logged out. | Client: 11

it won't let me in, it just logs me in and gives me that error on the console



login.lua

Lua:
local function onMovementRemoveProtection(cid, oldPos, time)
    local player = Player(cid)
    if not player then
        return true
    end

    local playerPos = player:getPosition()
    if (playerPos.x ~= oldPos.x or playerPos.y ~= oldPos.y or playerPos.z ~= oldPos.z) or player:getTarget() then
        player:setStorageValue(Storage.combatProtectionStorage, 0)
        return true
    end

    addEvent(onMovementRemoveProtection, 1000, cid, oldPos, time - 1)
end

local function protectionZoneCheck(playerName)
    doRemoveCreature(playerName)
    return true
end

local playerLogin = CreatureEvent("PlayerLogin")

function playerLogin.onLogin(player)
    local items = {
        {0, 0},
        {0, 0}
    }
    if player:getLastLoginSaved() == 0 then
        player:sendOutfitWindow()
        local backpack = player:addItem(0)
        if backpack then
            for i = 1, #items do
                backpack:addItem(items[i][1], items[i][2])
            end
        end
        player:addItem(0, 0, true, 0, CONST_SLOT_AMMO)
    else
        player:sendTextMessage(MESSAGE_STATUS, "Welcome to " .. SERVER_NAME .. "!")
        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, "Zanera Global: Welcome to our server, thank you for choosing us.")
        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, "Remember that when playing with client 12 you get a bonus of 30% more experience.")
        player:sendTextMessage(MESSAGE_LOGIN, string.format("Your last visit in ".. SERVER_NAME ..": %s.", os.date("%d. %b %Y %X", player:getLastLoginSaved())))
    end

    local playerId = player:getId()

    -- kick other players from account
    if configManager.getBoolean(configKeys.ONE_PLAYER_ON_ACCOUNT) then
        local resultId = db.storeQuery("SELECT players.name FROM `players` INNER JOIN `players_online` WHERE players_online.player_id=players.id and players_online.player_id!=" .. player:getGuid() .. " and players.account_id=" .. player:getAccountId())
        if resultId ~= false then
            repeat
                if player:getAccountType() <= ACCOUNT_TYPE_GOD and player:getGroup():getId() < GROUP_TYPE_GOD then
                    local name = result.getDataString(resultId, "name")
                    if getCreatureCondition(Player(name), CONDITION_INFIGHT) == false then
                        Player(name):remove()
                    else
                        addEvent(protectionZoneCheck, 2000, player:getName())
                        doPlayerPopupFYI(player, "You cant login now.")
                    end
                end
            until not result.next(resultId)
                result.free(resultId)
        end
    end
    -- End kick other players from account
    if isPremium(player) then
        player:setStorageValue(Storage.PremiumAccount, 1)
    end

    -- Recruiter system
    local resultId = db.storeQuery('SELECT `recruiter` from `accounts` where `id`='..getAccountNumberByPlayerName(getPlayerName(player)))
    local recruiterStatus = result.getNumber(resultId, 'recruiter')
    local sex = player:getSex()
    if recruiterStatus >= 1 then
        if sex == 1 then
            local outfit = player:hasOutfit(746)
            if outfit == false then
                player:addOutfit(746)
            end
        else
            local outfit = player:hasOutfit(745)
            if outfit == false then
                player:addOutfit(745)
            end
        end
    end
    if recruiterStatus >= 3 then
        if sex == 1 then
            local outfit = player:hasOutfit(746,1)
            if outfit == false then
                player:addOutfitAddon(746,1)
            end
        else
            local outfit = player:hasOutfit(745,1)
            if outfit == false then
                player:addOutfit(745,1)
            end
        end
    end
    if recruiterStatus >= 10 then
        if sex == 1 then
            local outfit = player:hasOutfit(746,2)
            if outfit == false then
                player:addOutfitAddon(746,2)
            end
        else
            local outfit = player:hasOutfit(745,2)
            if outfit == false then
                player:addOutfit(745,2)
            end
        end
    end
    -- End recruiter system

    DailyReward.init(playerId)

    player:loadSpecialStorage()

    if player:getGroup():getId() >= GROUP_TYPE_GAMEMASTER then
        player:setGhostMode(true)
    end

    -- Boosted creature
    player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Today's boosted creature: " .. Game.getBoostedCreature() .. " \
    Boosted creatures yield more experience points, carry more loot than usual and respawn at a faster rate.")

    -- Stamina
    nextUseStaminaTime[playerId] = 1

    -- EXP Stamina
    nextUseXpStamina[playerId] = 1

    -- Prey Small Window
    for slot = CONST_PREY_SLOT_FIRST, CONST_PREY_SLOT_THIRD do
        player:sendPreyData(slot)
    end

    -- New prey
    nextPreyTime[playerId] = {
        [CONST_PREY_SLOT_FIRST] = 1,
        [CONST_PREY_SLOT_SECOND] = 1,
        [CONST_PREY_SLOT_THIRD] = 1
    }

    if (player:getAccountType() == ACCOUNT_TYPE_TUTOR) then
    local msg = [[:: Tutor Rules
        1 *> 3 Warnings you lose the job.
        2 *> Without parallel conversations with players in Help, if the player starts offending, you simply mute it.
        3 *> Be educated with the players in Help and especially in the Private, try to help as much as possible.
        4 *> Always be on time, if you do not have a justification you will be removed from the staff.
        5 *> Help is only allowed to ask questions related to tibia.
        6 *> It is not allowed to divulge time up or to help in quest.
        7 *> You are not allowed to sell items in the Help.
        8 *> If the player encounters a bug, ask to go to the website to send a ticket and explain in detail.
        9 *> Always keep the Tutors Chat open. (required).
        10 *> You have finished your schedule, you have no tutor online, you communicate with some CM in-game
        or ts and stay in the help until someone logs in, if you can.
        11 *> Always keep a good Portuguese in the Help, we want tutors who support, not that they speak a satanic ritual.
        12 *> If you see a tutor doing something that violates the rules, take a print and send it to your superiors. "
        - Commands -
        Mute Player: /mute nick, 90 (90 seconds)
        Unmute Player: /unmute nick.
        - Commands -]]
        player:popupFYI(msg)
    end

    if table.contains({TOWNS_LIST.DAWNPORT, TOWNS_LIST.DAWNPORT_TUTORIAL}, player:getTown():getId())then
        player:openChannel(3) -- World chat
    else
        player:openChannel(3) -- World chat
        player:openChannel(5) -- Advertsing main
    end

    -- Rewards
    local rewards = #player:getRewardList()
    if(rewards > 0) then
        player:sendTextMessage(MESSAGE_LOGIN, string.format("You have %d %s in your reward chest.",
        rewards, rewards > 1 and "rewards" or "reward"))
    end

    -- Update player id
    local stats = player:inBossFight()
    if stats then
        stats.playerId = player:getId()
    end

    if player:getStorageValue(Storage.combatProtectionStorage) < 1 then
        player:setStorageValue(Storage.combatProtectionStorage, 1)
        onMovementRemoveProtection(playerId, player:getPosition(), 10)
    end
 
    -- Client 12 Bonus Experience
    local clientVersion = self:getClient().version
    if clientVersion >= 1200 then
    local baseExp = 130
    if Game.getStorageValue(GlobalStorage.XpDisplayMode) > 0 then
        baseExp = getRateFromTable(experienceStages, player:getLevel(), configManager.getNumber(configKeys.RATE_EXP))
    end
 
    -- Set Client XP Gain Rate
    local baseExp = 100
    if Game.getStorageValue(GlobalStorage.XpDisplayMode) > 0 then
        baseExp = getRateFromTable(experienceStages, player:getLevel(), configManager.getNumber(configKeys.RATE_EXP))
    end

    local staminaMinutes = player:getStamina()
    local doubleExp = false --Can change to true if you have double exp on the server
    local staminaBonus = (staminaMinutes > 2340) and 150 or ((staminaMinutes < 840) and 50 or 100)
    if doubleExp then
        baseExp = baseExp * 2
    end
    player:setStaminaXpBoost(staminaBonus)
    player:setBaseXpGain(baseExp)

    if player:getStorageValue(Storage.isTraining) == 1 then --Reset exercise weapon storage
        player:setStorageValue(Storage.isTraining,0)
    end
    return true
end
end
playerLogin:register()

EXP 12.png
 
Last edited by a moderator:

Xikini

I whore myself out for likes
Support Team
Joined
Nov 17, 2010
Messages
5,403
Solutions
361
Reaction score
3,513
There is something wrong with this scripts, I wanted to change the base xp gain rate of client 12, so I added this and now it gives me this error

Lua:
    -- Client 12 Bonus Experience
    local clientVersion = self:getClient().version
    if clientVersion >= 1200 then
    local baseExp = 130
    if Game.getStorageValue(GlobalStorage.XpDisplayMode) > 0 then
        baseExp = getRateFromTable(experienceStages, player:getLevel(), configManager.getNumber(configKeys.RATE_EXP))
    end

ERROR
Code:
Lua Script Error: [Scripts Interface]
/home/forgottenserver/data/scripts/creaturescripts/others/login.lua:callback
...ttenserver/data/scripts/creaturescripts/others/login.lua:192: attempt to index global 'self' (a nil value)
stack traceback:
        [C]: in function '__index'
        ...ttenserver/data/scripts/creaturescripts/others/login.lua:192: in function <...ttenserver/data/scripts/creaturescripts/others/login.lua:23>
GM Krotus has logged out. | Client: 12.61
GM Krotus has logged in. | Client: 11

Lua Script Error: [Scripts Interface]
/home/forgottenserver/data/scripts/creaturescripts/others/login.lua:callback
...ttenserver/data/scripts/creaturescripts/others/login.lua:192: attempt to index global 'self' (a nil value)
stack traceback:
        [C]: in function '__index'
        ...ttenserver/data/scripts/creaturescripts/others/login.lua:192: in function <...ttenserver/data/scripts/creaturescripts/others/login.lua:23>
GM Krotus has logged out. | Client: 11

it won't let me in, it just logs me in and gives me that error on the console



login.lua

Lua:
local function onMovementRemoveProtection(cid, oldPos, time)
    local player = Player(cid)
    if not player then
        return true
    end

    local playerPos = player:getPosition()
    if (playerPos.x ~= oldPos.x or playerPos.y ~= oldPos.y or playerPos.z ~= oldPos.z) or player:getTarget() then
        player:setStorageValue(Storage.combatProtectionStorage, 0)
        return true
    end

    addEvent(onMovementRemoveProtection, 1000, cid, oldPos, time - 1)
end

local function protectionZoneCheck(playerName)
    doRemoveCreature(playerName)
    return true
end

local playerLogin = CreatureEvent("PlayerLogin")

function playerLogin.onLogin(player)
    local items = {
        {0, 0},
        {0, 0}
    }
    if player:getLastLoginSaved() == 0 then
        player:sendOutfitWindow()
        local backpack = player:addItem(0)
        if backpack then
            for i = 1, #items do
                backpack:addItem(items[i][1], items[i][2])
            end
        end
        player:addItem(0, 0, true, 0, CONST_SLOT_AMMO)
    else
        player:sendTextMessage(MESSAGE_STATUS, "Welcome to " .. SERVER_NAME .. "!")
        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, "Zanera Global: Welcome to our server, thank you for choosing us.")
        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, "Remember that when playing with client 12 you get a bonus of 30% more experience.")
        player:sendTextMessage(MESSAGE_LOGIN, string.format("Your last visit in ".. SERVER_NAME ..": %s.", os.date("%d. %b %Y %X", player:getLastLoginSaved())))
    end

    local playerId = player:getId()

    -- kick other players from account
    if configManager.getBoolean(configKeys.ONE_PLAYER_ON_ACCOUNT) then
        local resultId = db.storeQuery("SELECT players.name FROM `players` INNER JOIN `players_online` WHERE players_online.player_id=players.id and players_online.player_id!=" .. player:getGuid() .. " and players.account_id=" .. player:getAccountId())
        if resultId ~= false then
            repeat
                if player:getAccountType() <= ACCOUNT_TYPE_GOD and player:getGroup():getId() < GROUP_TYPE_GOD then
                    local name = result.getDataString(resultId, "name")
                    if getCreatureCondition(Player(name), CONDITION_INFIGHT) == false then
                        Player(name):remove()
                    else
                        addEvent(protectionZoneCheck, 2000, player:getName())
                        doPlayerPopupFYI(player, "You cant login now.")
                    end
                end
            until not result.next(resultId)
                result.free(resultId)
        end
    end
    -- End kick other players from account
    if isPremium(player) then
        player:setStorageValue(Storage.PremiumAccount, 1)
    end

    -- Recruiter system
    local resultId = db.storeQuery('SELECT `recruiter` from `accounts` where `id`='..getAccountNumberByPlayerName(getPlayerName(player)))
    local recruiterStatus = result.getNumber(resultId, 'recruiter')
    local sex = player:getSex()
    if recruiterStatus >= 1 then
        if sex == 1 then
            local outfit = player:hasOutfit(746)
            if outfit == false then
                player:addOutfit(746)
            end
        else
            local outfit = player:hasOutfit(745)
            if outfit == false then
                player:addOutfit(745)
            end
        end
    end
    if recruiterStatus >= 3 then
        if sex == 1 then
            local outfit = player:hasOutfit(746,1)
            if outfit == false then
                player:addOutfitAddon(746,1)
            end
        else
            local outfit = player:hasOutfit(745,1)
            if outfit == false then
                player:addOutfit(745,1)
            end
        end
    end
    if recruiterStatus >= 10 then
        if sex == 1 then
            local outfit = player:hasOutfit(746,2)
            if outfit == false then
                player:addOutfitAddon(746,2)
            end
        else
            local outfit = player:hasOutfit(745,2)
            if outfit == false then
                player:addOutfit(745,2)
            end
        end
    end
    -- End recruiter system

    DailyReward.init(playerId)

    player:loadSpecialStorage()

    if player:getGroup():getId() >= GROUP_TYPE_GAMEMASTER then
        player:setGhostMode(true)
    end

    -- Boosted creature
    player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Today's boosted creature: " .. Game.getBoostedCreature() .. " \
    Boosted creatures yield more experience points, carry more loot than usual and respawn at a faster rate.")

    -- Stamina
    nextUseStaminaTime[playerId] = 1

    -- EXP Stamina
    nextUseXpStamina[playerId] = 1

    -- Prey Small Window
    for slot = CONST_PREY_SLOT_FIRST, CONST_PREY_SLOT_THIRD do
        player:sendPreyData(slot)
    end

    -- New prey
    nextPreyTime[playerId] = {
        [CONST_PREY_SLOT_FIRST] = 1,
        [CONST_PREY_SLOT_SECOND] = 1,
        [CONST_PREY_SLOT_THIRD] = 1
    }

    if (player:getAccountType() == ACCOUNT_TYPE_TUTOR) then
    local msg = [[:: Tutor Rules
        1 *> 3 Warnings you lose the job.
        2 *> Without parallel conversations with players in Help, if the player starts offending, you simply mute it.
        3 *> Be educated with the players in Help and especially in the Private, try to help as much as possible.
        4 *> Always be on time, if you do not have a justification you will be removed from the staff.
        5 *> Help is only allowed to ask questions related to tibia.
        6 *> It is not allowed to divulge time up or to help in quest.
        7 *> You are not allowed to sell items in the Help.
        8 *> If the player encounters a bug, ask to go to the website to send a ticket and explain in detail.
        9 *> Always keep the Tutors Chat open. (required).
        10 *> You have finished your schedule, you have no tutor online, you communicate with some CM in-game
        or ts and stay in the help until someone logs in, if you can.
        11 *> Always keep a good Portuguese in the Help, we want tutors who support, not that they speak a satanic ritual.
        12 *> If you see a tutor doing something that violates the rules, take a print and send it to your superiors. "
        - Commands -
        Mute Player: /mute nick, 90 (90 seconds)
        Unmute Player: /unmute nick.
        - Commands -]]
        player:popupFYI(msg)
    end

    if table.contains({TOWNS_LIST.DAWNPORT, TOWNS_LIST.DAWNPORT_TUTORIAL}, player:getTown():getId())then
        player:openChannel(3) -- World chat
    else
        player:openChannel(3) -- World chat
        player:openChannel(5) -- Advertsing main
    end

    -- Rewards
    local rewards = #player:getRewardList()
    if(rewards > 0) then
        player:sendTextMessage(MESSAGE_LOGIN, string.format("You have %d %s in your reward chest.",
        rewards, rewards > 1 and "rewards" or "reward"))
    end

    -- Update player id
    local stats = player:inBossFight()
    if stats then
        stats.playerId = player:getId()
    end

    if player:getStorageValue(Storage.combatProtectionStorage) < 1 then
        player:setStorageValue(Storage.combatProtectionStorage, 1)
        onMovementRemoveProtection(playerId, player:getPosition(), 10)
    end
 
    -- Client 12 Bonus Experience
    local clientVersion = self:getClient().version
    if clientVersion >= 1200 then
    local baseExp = 130
    if Game.getStorageValue(GlobalStorage.XpDisplayMode) > 0 then
        baseExp = getRateFromTable(experienceStages, player:getLevel(), configManager.getNumber(configKeys.RATE_EXP))
    end
 
    -- Set Client XP Gain Rate
    local baseExp = 100
    if Game.getStorageValue(GlobalStorage.XpDisplayMode) > 0 then
        baseExp = getRateFromTable(experienceStages, player:getLevel(), configManager.getNumber(configKeys.RATE_EXP))
    end

    local staminaMinutes = player:getStamina()
    local doubleExp = false --Can change to true if you have double exp on the server
    local staminaBonus = (staminaMinutes > 2340) and 150 or ((staminaMinutes < 840) and 50 or 100)
    if doubleExp then
        baseExp = baseExp * 2
    end
    player:setStaminaXpBoost(staminaBonus)
    player:setBaseXpGain(baseExp)

    if player:getStorageValue(Storage.isTraining) == 1 then --Reset exercise weapon storage
        player:setStorageValue(Storage.isTraining,0)
    end
    return true
end
end
playerLogin:register()

View attachment 57944
change
Lua:
local clientVersion = self:getClient().version
to
Lua:
local clientVersion = player:getClient().version
 
OP
A

adrenyslopez

Member
Joined
Dec 22, 2015
Messages
158
Reaction score
10
change
Lua:
local clientVersion = self:getClient().version
to
Lua:
local clientVersion = player:getClient().version
It no longer gives me an error, but it does not work for me but modifying this part

Lua:
    -- Set Client XP Gain Rate
    local baseExp = 100
    if Game.getStorageValue(GlobalStorage.XpDisplayMode) > 0 then
        baseExp = getRateFromTable(experienceStages, player:getLevel(), configManager.getNumber(configKeys.RATE_EXP))
    end
if the xp gain rate is changed for the two clients, I just want it to be modified in client 12
 
Top