• 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!

Wywołanie wartości z bazy danych

badovskz

New Member
Joined
Feb 8, 2018
Messages
16
Reaction score
0
Witam

Mam problem, chciałbym wywołać wartość liczbową z bazy danych, aczkolwiek cały czas wywala mi błąd w konsoli


Lua:
        function getPlayerResets(name)
           local query = db.storeQuery("SELECT reborns FROM players WHERE name="..db.escapeString(name).."")
           if query ~= false then
            local val = result.getDataInt(query, "value")
                result.free(query)
                return val
            end
        return -1
        end

A to jest błądd

Code:
Lua Script Error: [Npc interface]
data/npc/scripts/rebirth.lua:onCreatureSay
data/npc/scripts/rebirth.lua:77: attempt to concatenate global 'val' (a nil value)
stack traceback:
        [C]: in function '__concat'
        data/npc/scripts/rebirth.lua:77: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:401: in function 'onCreatureSay'
        data/npc/scripts/rebirth.lua:8: in function <data/npc/scripts/rebirth.lua:8>

Próbowałem też na inne sposoby ale bez rezultatu


Code:
        ---local levelaktualny = db.storeQuery("SELECT `reborns` FROM `players` WHERE `name` = " .. db.escapeString(name))
        ---local levelaktualny = db.storeQuery("SELECT `value` FROM `players` ORDER BY `players`.`reborns` WHERE  name='" .. getPlayerName(cid))
        ---local getPoints = db.storeQuery('SELECT reborns FROM players WHERE name= ' .. getPlayerName(cid) .. ''):getDataInt("reborns")           
    
        ---function getreborn(id)
        ---local res = db.getResult("SELECT `reborns` FROM `players` WHERE `name` = "..getPlayerName(cid)..";")
        ---local resint:result.getNumber(data, "reborns") + 1
        ---end   

        ---local levelaktualny = db.storeQuery('SELECT `reborns` FROM `players` WHERE name= ' .. getPlayerName(cid) ..)
        ---local rebornsid = levelaktualny:getDataInt("reborns")


Dzięki za pomoc :)
 
Mój błąd racja :).

Poprawiłem i teraz wygląda tak
Lua:
function Player.getreset(cid)
            local res = db.storeQuery('SELECT `reborns` FROM `players` WHERE name=' .. getPlayerName(cid) ..';')
            local points = 0
                if res then
                points = result.getNumber(res, 'reborns')
                end
            result.free(res)
            return points
        end


a błąd wywala taki

Code:
Lua Script Error: [Npc interface]
data/npc/scripts/rebirth.lua:onCreatureSay
data/npc/scripts/rebirth.lua:76: attempt to concatenate global 'points' (a nil value)
stack traceback:
        [C]: in function '__concat'
        data/npc/scripts/rebirth.lua:76: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:401: in function 'onCreatureSay'
        data/npc/scripts/rebirth.lua:8: in function <data/npc/scripts/rebirth.lua:8>


#edit
Dodam iż jest to TFS 1.3 tibia 8.6
 
jasne rozumiem, już dodaje pełen kod

Lua:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}

function onCreatureAppear(cid)              npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid)           npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg)          npcHandler:onCreatureSay(cid, type, msg) end
function onThink()                  npcHandler:onThink() end

function creatureSayCallback(cid, type, msg)
    if(not npcHandler:isFocused(cid)) then
        return false
    end

    local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

    if(msgcontains(msg, 'reborn')) then
        selfSay('Are you ready to Reborn and start a new life?', cid)
        talkState[talkUser] = 1
    elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 1) then
        -------CONFIGS-------
        ---local levelaktualny = db.storeQuery("SELECT `reborns` FROM `players` WHERE `name` = " .. db.escapeString(name))
        ---local levelaktualny = db.storeQuery("SELECT `value` FROM `players` ORDER BY `players`.`reborns` WHERE  name='" .. getPlayerName(cid))
        ---local getPoints = db.storeQuery('SELECT reborns FROM players WHERE name= ' .. getPlayerName(cid) .. ''):getDataInt("reborns")       

        ---function getreborn(id)
        ---local res = db.getResult("SELECT `reborns` FROM `players` WHERE `name` = "..getPlayerName(cid)..";")
        ---local resint:result.getNumber(data, "reborns") + 1
        ---end

        ---local levelaktualny = db.storeQuery('SELECT `reborns` FROM `players` WHERE name= ' .. getPlayerName(cid) ..)
        ---local rebornsid = levelaktualny:getDataInt("reborns")


function Player.getreset(cid)
            local res = db.storeQuery('SELECT `reborns` FROM `players` WHERE name=' .. getPlayerName(cid) ..';')
            local points = 0
                if res then
                points = result.getNumber(res, 'reborns')
                end
            result.free(res)
            return points
        end   

        local level = 350
        local cost = 0
        ------/CONFIGS-------
        -----LOCALS-----
        local id = getPlayerGUID(cid)
        local name = getCreatureName(cid)
        local vocation = getPlayerVocation(cid)
        local storage = getPlayerStorageValue(cid, 85987)
        ----/LOCALS-----
        if((getPlayerLevel(cid) >= level) == TRUE) then
            if(doPlayerRemoveMoney(cid, cost) == TRUE) then
                if(isInArray({1, 2, 3, 4, 5, 6, 7, 8}, vocation)) then
                    local player = Player(cid)
                    player:setStorageValue(cid, 85987, storage == -1 and 1 or storage + 1)
                    db.query('UPDATE players SET reborns=reborns+'.. 1 ..' WHERE id='..getPlayerGUID(cid))
                            Game.broadcastMessage("" ..  name .. " has just prestiged!", MESSAGE_STATUS_WARNING)
                    doRemoveCreature(cid)
                    db.query("UPDATE players SET level = 8, experience = 4200")
                    db.query("UPDATE players[/ICODE] SET [ICODE]name[/ICODE] = '"..name.."' WHERE [ICODE]id[/ICODE] ='"..id.."';")
                
                else
                    selfSay('Please talk with Forgotten King and promote first.', cid)
                    talkState[talkUser] = 0
                end
            else
                selfSay('You don\'t have enough money. You need to pay 1 gold coin to be rebirthed.', cid)
                talkState[talkUser] = 0
            end
        else
            selfSay('Only characters of level '.. points ..' or higher can be rebirthed.', cid)
            talkState[talkUser] = 0
        end
    elseif(msgcontains(msg, 'no') and talkState[talkUser] == 1) then
        selfSay('Okey. Come back when you feel ready.', cid)
        talkState[talkUser] = 0
    end

    return true
end


npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())


Do tego skryptu, wyskakuje taki błąd

Code:
Lua Script Error: [Npc interface]
data/npc/scripts/rebirth.lua:onCreatureSay
data/npc/scripts/rebirth.lua:75: attempt to concatenate global 'points' (a nil value)
stack traceback:
        [C]: in function '__concat'
        data/npc/scripts/rebirth.lua:75: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:401: in function 'onCreatureSay'
        data/npc/scripts/rebirth.lua:8: in function <data/npc/scripts/rebirth.lua:8>



#Edit
gdzieś na forum wyczytałem iż funkcja "if" gryzie się "nie wiadomo z czym" ale gryzie.
Zamiast if , ktoś użył funkcji while i wtedy ruszyło ale nie do końca

Kod wygląda teraz tak
Lua:
           local resultrr = db.storeQuery('SELECT `reborns` FROM `players` WHERE name=' .. getPlayerName(cid) ..';')

            local rows = 0              
            local tmpResultId = resultrr
                while tmpResultId ~= false  do
                tmpResultId = result.next(resultrr)
                rows = rows + 1
                print(rows)
            end

A błąd w konsoli wygląda tak
Code:
[Error - mysql_real_query] Query: SELECT `reborns` FROM `players` WHERE name=badzik;
Message: Unknown column 'badzik' in 'where clause'
[Error - mysql_store_result] Query: SELECT `reborns` FROM `players` WHERE name=badzik;
Message: Unknown column 'badzik' in 'where clause'
 
Last edited:
Nie wiem czemu post wyżej się nie dodał ale zmieniłem skrypt na ten

Lua:
            local resultrr = db.storeQuery("SELECT `reborns` FROM `players` WHERE `name` = "..db.escapeString(name)..";")   
            local rows = result.getDataInt(resultrr, "reborns")

a błąd wygląda tak

Code:
Lua Script Error: [Npc interface]
data/npc/scripts/rebirth.lua:onCreatureSay
data/npc/scripts/rebirth.lua:79: attempt to concatenate local 'rows' (a boolean value)
stack traceback:
        [C]: in function '__concat'
        data/npc/scripts/rebirth.lua:79: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:401: in function 'onCreatureSay'
        data/npc/scripts/rebirth.lua:8: in function <data/npc/scripts/rebirth.lua:8>


TFS 1.3


Pytanie brzmi, dlaczego wartość jest boolean ?
 
Last edited:
Przepraszam, post gdzie dodałem pełen kod nie został dodany.

Oto kod
Lua:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
 
function onCreatureAppear(cid)              npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid)           npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg)          npcHandler:onCreatureSay(cid, type, msg) end
function onThink()                  npcHandler:onThink() end
 
function creatureSayCallback(cid, type, msg)
    if(not npcHandler:isFocused(cid)) then
        return false
    end
 
    local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
 
    if(msgcontains(msg, 'reborn')) then
        selfSay('Are you ready to Reborn and start a new life?', cid)
        talkState[talkUser] = 1
    elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 1) then
        -------CONFIGS-------   
        ---local levelaktualny = db.storeQuery("SELECT `reborns` FROM `players` WHERE `name` = " .. db.escapeString(name))
        ---local levelaktualny = db.storeQuery("SELECT `value` FROM `players` ORDER BY `players`.`reborns` WHERE  name='" .. getPlayerName(cid))
        ---local getPoints = db.storeQuery('SELECT reborns FROM players WHERE name= ' .. getPlayerName(cid) .. ''):getDataInt("reborns")           
    
        ---function getreborn(id)
        ---local res = db.getResult("SELECT `reborns` FROM `players` WHERE `name` = "..getPlayerName(cid)..";")
        ---local resint:result.getNumber(data, "reborns") + 1
        ---end   

        ---local levelaktualny = db.storeQuery('SELECT `reborns` FROM `players` WHERE name= ' .. getPlayerName(cid) ..)
        ---local rebornsid = levelaktualny:getDataInt("reborns")
        ---local resultrr = db.storeQuery('SELECT `reborns` FROM `players` WHERE name=' .. getPlayerName(cid) ..';')
        ------local getPlayerResets = db.getResult("SELECT reborns FROM players WHERE name="..db.escapeString(name)..""):getDataInt("reborns")
            
            
            local resultId = db.getResult("SELECT `level` FROM `players` WHERE `players`.`id` = " .. getPlayerGUID(oldPlayer) .. ";")
            local reborns = resultId:getDataInt "reborns"

        

            
            
            



        

        local level = 350
        local cost = 0
        ------/CONFIGS-------
        -----LOCALS-----
        local id = getPlayerGUID(cid)
        local name = getCreatureName(cid)
        local vocation = getPlayerVocation(cid)
        local storage = getPlayerStorageValue(cid, 85987)
        ----/LOCALS-----
        if((getPlayerLevel(cid) >= level) == TRUE) then
            if(doPlayerRemoveMoney(cid, cost) == TRUE) then
                if(isInArray({1, 2, 3, 4, 5, 6, 7, 8}, vocation)) then
                    local player = Player(cid)
                    player:setStorageValue(cid, 85987, storage == -1 and 1 or storage + 1)
                    db.query('UPDATE players SET reborns=reborns+'.. 1 ..' WHERE id='..getPlayerGUID(cid))
                            Game.broadcastMessage("" ..  rows .. " has just prestiged!", MESSAGE_STATUS_WARNING)
                    doRemoveCreature(cid)
                    db.query("UPDATE players SET level = 8, experience = 4200")
                    db.query("UPDATE players[/ICODE] SET [ICODE]name[/ICODE] = '"..name.."' WHERE [ICODE]id[/ICODE] ='"..id.."';")
                    
                else
                    selfSay('Please talk with Forgotten King and promote first.', cid)
                    talkState[talkUser] = 0
                end
            else
                selfSay('You don\'t have enough money. You need to pay 1 gold coin to be rebirthed.', cid)
                talkState[talkUser] = 0
            end
        else
            selfSay('Only characters of level '..reborns..' or higher can be rebirthed.', cid)
            talkState[talkUser] = 0
        end
    elseif(msgcontains(msg, 'no') and talkState[talkUser] == 1) then
        selfSay('Okey. Come back when you feel ready.', cid)
        talkState[talkUser] = 0
    end
 
    return true
end

 
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
 
Poprawiłem tak jak mówisz ale niestety dalej problem

Kod
Lua:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
 
function onCreatureAppear(cid)              npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid)           npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg)          npcHandler:onCreatureSay(cid, type, msg) end
function onThink()                  npcHandler:onThink() end
 
function creatureSayCallback(cid, type, msg)
    if(not npcHandler:isFocused(cid)) then
        return false
    end




    
-- ex: local id = getPlayerIdByName(Marcelo) -- retorna o Id da database do player Marcelo

function getPlayerIdByName(name)
    local resultID = db.storeQuery("SELECT `id` FROM `players` WHERE `name` = " .. db.escapeString(name))
    if resultID ~= false then
        local id = result.getDataString(resultID, "id")
        result.free(resultID)
        return id
    end
    return 0
end

-- ex: local id = getPlayerID(cid) -- retorna o ID do player na database utilizando o cid

function getPlayerID(cid)
return getPlayerIdByName(getPlayerName(cid))
end
 
 
 
 
    local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
 
    if(msgcontains(msg, 'reborn')) then
        selfSay('Are you ready to Reborn and start a new life?', cid)
        talkState[talkUser] = 1
    elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 1) then
        -------CONFIGS-------   
        local level = 350
        local cost = 0
        ------/CONFIGS-------
        -----LOCALS-----
        local id = getPlayerGUID(cid)
        local name = getCreatureName(cid)
        local vocation = getPlayerVocation(cid)
        local storage = getPlayerStorageValue(cid, 85987)
        
        local resultId = db.storeQuery("SELECT `reborns` FROM `players` WHERE `id` = " .. getPlayerID(cid))
            print(db.escapeString(name))
            if resultId then
                local status = result.getDataInt(resultId, "reborns")
            end

        
        ----/LOCALS-----
        if (getPlayerLevel(cid) < level) then
            selfSay('Only characters of level ' .. status .. ' or higher can be rebirthed.', cid)
            return true
        end

        if (not doPlayerRemoveMoney(cid, cost)) then
            selfSay('You don\'t have enough money. You need to pay 1 gold coin to be rebirthed.', cid)
            return true
        end

        if (not isInArray({1, 2, 3, 4, 5, 6, 7, 8}, vocation)) then
                local player = Player(cid)
                    player:setStorageValue(85987)
                    db.query('UPDATE players SET reborns=reborns+'.. 1 ..' WHERE id='..getPlayerGUID(cid))
                    Game.broadcastMessage("" ..  name .. " has just prestiged!", MESSAGE_STATUS_WARNING)
                    doRemoveCreature(cid)
                    db.query("UPDATE players SET level = 8, experience = 4200")
                    db.query("UPDATE players SET name = '"..name.."' id ='"..id.."';")
                    
                else
                    selfSay('Please talk with Forgotten King and promote first.', cid)
                return true
        end
        
        
        
    elseif(msgcontains(msg, 'no') and talkState[talkUser] == 1) then
        selfSay('Okey. Come back when you feel ready.', cid)
        talkState[talkUser] = 0
    end
 
    return true
end

 
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

Błąd
Code:
Lua Script Error: [Npc interface]
data/npc/scripts/rebirth.lua:onCreatureSay
data/npc/scripts/rebirth.lua:66: attempt to concatenate global 'status' (a nil value)
stack traceback:
        [C]: in function '__concat'
        data/npc/scripts/rebirth.lua:66: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:401: in function 'onCreatureSay'
        data/npc/scripts/rebirth.lua:8: in function <data/npc/scripts/rebirth.lua:8>
 
jak dziwne zapytania ? skoro gracz wykona reborn to ma mu sie obniżyć lvl, stąd to zapytanie które powoduje początkowy lvl. Nie rozumiem poco usunąłeś wiadomości , ale no cóż :).

ps. orłem nie jestem ale każdy zaczyna przygodę od 0 z nowym językiem .

skrpt nie mój , ja go sie staram tylko przerobić tak by to miało ręce i nogi na tfs 1.3
 
Zrobione

Dla pokolenia - skrypt ten powoduje reborn u postaci Lvl wymaganym , następnie co reborn zwiększany jest wymagany lvl

Lua:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
local reset = 0


function onCreatureAppear(cid)              npcHandler:eek:nCreatureAppear(cid) end
function onCreatureDisappear(cid)           npcHandler:eek:nCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg)          npcHandler:eek:nCreatureSay(cid, type, msg) end
function onThink()                  npcHandler:eek:nThink() end



function creatureSayCallback(cid, type, msg)
    if(not npcHandler:isFocused(cid)) then
        return false
    end

    local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
 
    local levelaktualny = db.storeQuery("SELECT 'reborns' FROM 'players' WHERE 'name' = '"..getCreatureName(cid).."'")
        reset = result.getNumber(levelaktualny, 'reborns')
    result.free(levelaktualny)
 


    if(msgcontains(msg, 'reborn')) then
        selfSay('Are you ready to Reborn and start a new life?', cid)
        talkState[talkUser] = 1
    elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 1) then
        -------CONFIGS-------
        local level = (350+((reset)*150))
        local cost = 0
        ------/CONFIGS-------
        -----LOCALS-----
        local id = getPlayerGUID(cid)
        local name = getCreatureName(cid)
        local vocation = getPlayerVocation(cid)
        local storage = getPlayerStorageValue(cid, 85987)
        ----/LOCALS-----
        if((getPlayerLevel(cid) >= level) == TRUE) then
                        if(doPlayerRemoveMoney(cid, cost) == TRUE) then
                                    if(isInArray({1, 2, 3, 4, 5, 6, 7, 8}, vocation)) then
                                        local player = Player(cid)
                                        db.query('UPDATE players SET reborns=reborns+'.. 1 ..' WHERE id='..getPlayerGUID(cid))
                                                Game.broadcastMessage("" ..  name .. " has just prestiged!", MESSAGE_STATUS_WARNING)
                                        doRemoveCreature(cid)
                                        db.query("UPDATE players SET level = 8, experience = 4200")
                                     
                                    else
                                        selfSay('Please talk with Forgotten King and promote first.', cid)
                                        talkState[talkUser] = 0
                                    end
                        else
                            selfSay('You don\'t have enough money. You need to pay 1 gold coin to be rebirthed.', cid)
                            talkState[talkUser] = 0
                        end
        else
            selfSay('Only characters of level '.. level ..' or higher can be rebirthed.', cid)

            talkState[talkUser] = 0
        end
    elseif(msgcontains(msg, 'no') and talkState[talkUser] == 1) then
        selfSay('Okey. Come back when you feel ready.', cid)
        talkState[talkUser] = 0
    end
    return reset
end


npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

#Kor , mylisz się, zmienia tylko i wyłącznie postaciom tym które "prowadzą rozmowę" , skrypt ten jest do NPC z którym rozmawia gracz, tak wiec owa postać zostanie zakutalizowana w bazie

De facto, dzięki za pomoc, czasem zjeba tez jest potrzebna do motywacji :))
 
Last edited:
Nie działa twój kod, zawiesza sie na vocation.
nie bede sie zaglebiac, moze jest "zgrabniejszy" .
swoj z czasem dopieszcze tak by wygladal zgrabniej, aktualnie w fazie testow zalezalo mi tylko na tym by to dzialalo, potem mozna myslec dalej :).

# edit
a co do bledow, to nie wiem co masz na mysli, mi jakos nie sypie
 
Back
Top