Ir para conteúdo
  • Cadastre-se

(Resolvido)[Erro] Porta de reputação


Ir para solução Resolvido por joadson,

Posts Recomendados

Olá TK,
Estou com um problema em meu sistema de reputação , pois ele funcionava em um server e agora não funciona em outro por um erro que ele dá.

Primeiro vou mostrar os scripts utilizados:

 

mods/rep_system.lua

<?xml version="1.0" encoding="UTF-8"?>


<!-- NECESSARY SQL QUERY FOR THE REPUTATION SYSTEM
MySQL: ALTER TABLE `players` ADD `rep` INT( 11 ) NOT NULL DEFAULT '0';
SQLite: ALTER TABLE "players" ADD "rep" INT( 11 ) NOT NULL DEFAULT "0";
CREDITS: Sync.darkhaos.Colandus.Shawak.Absolute Mango.nsanee -->
<mod name="Cyber's REPutation System" revision="5.0" author="Cybermaster" contact="otland.net" enabled="yes">

<config name="repSystem"><![CDATA[
rep = {
    --[[ GLOBAL CONFIG ]]--
    interval = 6 * 60 * 60, --This is [6] hours, in seconds. Time between rep.
    lastTime = 5136, --Used to store the player's last Rep Timestamp
    lastName = 5138, --Used to store the last repped's GUID
    minLevel = 20, --From this level onwards player can use commands
    pvpLevel = 30, --Minimum level for PVP Rep'ing
    skull = {4,5}, --these skulled player won't receive rep when killing

    getArticle = function(cid, uppercase)
        return getPlayerSex(cid) == 0 and (uppercase and 'S' or 's') ..'he' or (uppercase and 'H' or 'h') ..'e'
    end,
    
    getPoints = function(cid)
        local Info = db.getResult("SELECT `rep` FROM `players` WHERE `id` = " .. getPlayerGUID(cid) .. ";")
        local rep = Info:getDataInt("rep")
        Info:free()
        return rep
    end,
    
    getPower = function(points)
        local power = {{0,2},{300,3},{500,4},{1000,5},{1500,6},{2000,8},{5000,10}}
        table.sort(power, function(a, b) return a[1] > b[1] end)
        for _, t in ipairs(power) do    
            if(math.abs(points) >= t[1]) then
                return t[2]
            end
        end
        return power[1][2]
    end,
    
    getRank = function(points)
        local ranks = {
            {-5000, 'Power Abuser (+============)'},
            {-2000, 'Evil (=|===========)'},
            {-1500, 'Slayer (==|==========)'},
            {-1000, 'Killer (===|=========)'},
            {-500, 'Villain (====|========)'},
            {-300, 'Creeping (=====|=======)'},
            {-299, 'Noob (======|======)'},
            {300, 'Avowed (=======|=====)'},
            {500, 'Popular (========|====)'},
            {1000, 'Hailed (=========|===)'},
            {1500, 'Acclaimed (==========|==)'},
            {2000, 'Hero (===========|=)'},
            {5000, 'Legend (============+)'},
        }
        if points > -1 then
            table.sort(ranks, function(a, b) return a[1] > b[1] end)
            for _, t in ipairs(ranks) do if points >= t[1] then return t[2] end end
        else
            table.sort(ranks, function(a, b) return a[1] < b[1] end)
            for _, t in ipairs(ranks) do if points <= t[1] then return t[2] end end
        end        
    return ranks[1][2]
    end,
    
    set = function(cid, points)
        db.executeQuery("UPDATE `players` SET `rep` = " .. points .. " WHERE `id` = " .. getPlayerGUID(cid) .. ";")
    end,

    add = function(cid, amount, color)
        db.executeQuery("UPDATE `players` SET `rep` = `rep` + " .. amount .. " WHERE `id` = " .. getPlayerGUID(cid) .. ";")
        doSendAnimatedText(getCreaturePosition(cid), '+REP', color)
        doPlayerSendCancel(cid,'You have just been hailed and gained '.. amount ..' reputation points.')
    end,
    
    remove = function(cid, amount, color)
        db.executeQuery("UPDATE `players` SET `rep` = `rep` - " .. amount .. " WHERE `id` = " .. getPlayerGUID(cid) .. ";")
        doSendAnimatedText(getCreaturePosition(cid), '-REP', color)
        doPlayerSendCancel(cid,'You have just been repudiated and lost '.. amount ..' reputation points.')
    end,

    getTime = function(timeDiff)
        local dateFormat = {
            {'h', timeDiff / 60 / 60 % 6},
            {'m', timeDiff / 60 % 60},
        }
        local out = {}
        for k, t in ipairs(dateFormat) do
            local v = math.floor(t[2])
            if(v > 0) then
                table.insert(out, (k < #dateFormat and '' or ' and ') .. v .. '' .. t[1])
            end
        end
    return table.concat(out)
    end,  
    
    formatNum = function(str, sep)
        str = tostring(str):reverse()
        str = str:gsub("(%d)(%d)(%d)", '%1%2%3' .. (sep or " "), math.ceil(str:len() / 3)-1)
    return str:reverse()
    end,
}]]>
</config>
       
<event type="login" name="repRegister" event="script"><![CDATA[
    function onLogin(cid)
        registerCreatureEvent(cid, "repLook")  
        registerCreatureEvent(cid, "repKill")  
        registerCreatureEvent(cid, "repMonster")
    return true
    end]]>
</event>
       
<event type="look" name="repLook" event="script"><![CDATA[
    domodlib('repSystem')
    function onLook(cid, thing, position, lookDistance)
        if isPlayer(thing.uid) then
            doPlayerSetSpecialDescription(thing.uid,'.\n' .. (thing.uid == cid and 'He are' or rep.getArticle(thing.uid, true) .. ' is') .. ' ' .. rep.getRank(rep.getPoints(thing.uid)))
        end            
    return true
    end]]>
</event>
               
<event type="kill" name="repKill" event="script"><![CDATA[
    domodlib('repSystem')
    local t = {
    [sKULL_WHITE] = 30,
    [sKULL_RED] = 45,
    [sKULL_BLACK] = 45,
    [sKULL_NONE] = -30,
    }

    function onKill(cid, target, lastHit)
        if isPlayer(cid) and isPlayer(target) then
        --THE KILLER
            if isInArray({0,3,4,5}, getCreatureSkullType(target)) then
                if getPlayerLevel(target) >= rep.pvpLevel and not isInArray(rep.skull, getCreatureSkullType(cid)) then
                    doSendAnimatedText(getCreaturePosition(cid), getCreatureSkullType(target) == 0 and '-REP' or '+REP', math.random(1,255))
                    rep.set(cid, rep.getPoints(cid)+t[getCreatureSkullType(target)])
                    doPlayerSendTextMessage(cid, 20, 'You '.. (getCreatureSkullType(target) == 0 and 'lose' or 'gain') ..' reputation because you killed a player.')
                end
            end
        --THE VICTIM
            if rep.getPoints(target) == 0 then
                return true
            elseif rep.getPoints(target) > 0 then
                rep.remove(target, 5, TEXTCOLOR_RED)
                doPlayerSendTextMessage(target, 20, 'You lose reputation because you were killed by a player.')
            else
                rep.add(target, 5, TEXTCOLOR_LIGHTBLUE)
                doPlayerSendTextMessage(target, 20, 'You lose reputation because you were killed by a player.')
            end
        end
    return true
    end]]>
</event>
               
<event type="kill" name="repMonster" event="script"><![CDATA[
    domodlib('repSystem')
    function onKill(cid, target, lastHit)
        if not isPlayer(cid) or not isMonster(target) then
            return true
        end

        local monsters = {
            ["behemoth"] = 0,
            ["hellfire fighter"] = 0,
        }
        
        local name = getCreatureName(target)
        local monster = monsters[string.lower(name)]
        
        if monster then
            rep.add(cid, monsters[string.lower(getCreatureName(target))], TEXTCOLOR_LIGHTBLUE)
        end
    return true
    end]]>
</event>
       
<talkaction log= "yes" words="/hail;/fuck;/set" access="4" event="buffer"><![CDATA[
    domodlib('repSystem')
    
        if param == '' then
            doPlayerSendCancel(cid,'You must write a player\'s name.')
        return true
        end

        local t = string.explode(param, ',')
        local tid = getPlayerByName(t[1])

        if not isPlayer(tid) then
            doPlayerSendCancel(cid, 'Player ' .. param .. ' not found or is not online.')
        return true
        end
       
        if not t[2] and isPlayer(tid) then  
            if words == '/hail' then
                rep.add(tid, 5, TEXTCOLOR_TEAL)
                doPlayerSendCancel(cid, 'You added +5 rep points to ' .. getPlayerName(tid) .. ', and now ' .. rep.getArticle(tid, false) .. ' has ' .. rep.getPoints(tid) .. ' points.')
            return true
            end
               
            if words == '/fuck' then
                rep.remove(tid, 5, TEXTCOLOR_RED)
                doPlayerSendCancel(cid, 'You removed -5 rep points to ' .. getPlayerName(tid) .. ', and now ' .. rep.getArticle(tid, false) .. ' has ' .. rep.getPoints(tid) .. ' points.')
            return true
            end
        end
       
        if t[2] and isInArray({'/set','/hail','fuck'}, words) then
            if not tonumber(t[2]) then
                doPlayerSendCancel(cid, 'Reputation amount is invalid.')
            return true
            end                                    
        end
       
        if words == '/hail' then
            rep.add(tid, t[2], TEXTCOLOR_TEAL)
            doPlayerSendCancel(cid, 'You added ' .. t[2] .. ' rep points to ' .. getPlayerName(tid) .. ', and now ' .. rep.getArticle(tid, false) .. ' has ' .. rep.getPoints(tid) .. ' points.')
        return true
        end
               
        if words == '/fuck' then
            rep.remove(tid, t[2], TEXTCOLOR_RED)
            doPlayerSendCancel(cid, 'You removed ' .. t[2] .. ' rep points to ' .. getPlayerName(tid) .. ', and now ' .. rep.getArticle(tid, false) .. ' has ' .. rep.getPoints(tid) .. ' points.')
        return true
        end
               
        if t[2] and words == '/set' then
            rep.set(tid, t[2])
            doPlayerSendCancel(cid, 'You have set ' .. getPlayerName(tid) .. '\'s points to ' .. rep.getPoints(tid))
        else
            doPlayerSendCancel(cid, 'Absolute reputation amount not specified.')
        return true
        end
       
        if not t[2] then
            doPlayerSendCancel(cid, 'Absolute reputation amount not specified.')
        return true
        end    
    return true]]>
</talkaction>
       
<talkaction words="!ranks" event="buffer"><![CDATA[
    domodlib('repSystem')
        local players = 10
        local str, value, name, result = "","","",0,nil
        if isInArray({'hero','pos','1','+'}, param) then
            str,value,name = "[#]-[Name]-[Points]-[Rank]\n--[Positive Rep Highscores]--\n","rep","name"
            result = db.getResult("SELECT `name`, `rep` FROM `players` WHERE `rep` > -1 AND `id` > 6 AND `group_id` < 2 ORDER BY `rep` DESC, `name` ASC;")
        elseif isInArray({'evil','neg','2','-'}, param) then
            str,value,name = "[#]-[Name]-[Points]-[Rank]\n--[Negative Rep Highscores]--\n","rep","name"
            result = db.getResult("SELECT `name`, `rep` FROM `players` WHERE `rep` < 0 AND `id` > 6 AND `group_id` < 2 ORDER BY `rep` ASC, `name` DESC;")    
        else
             doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Unknown Paramater: '" .. param .. "'")
             return true
        end

        if (result:getID() ~= -1) then
            local i = 1
            while true do
                str = str .. "\n " .. i .. ". " .. result:getDataString("name") .. " - [" .. result:getDataInt(value) .. "] - " .. rep.getRank(result:getDataInt(value)) .. ""
                i = i+1
                if not(result:next()) or i > players then
                    break
                end
            end
            result:free()
        end
        if str ~= "" then
            doPlayerPopupFYI(cid, str)
        end
    return true]]>
</talkaction>
       
<talkaction words="!rep" event="buffer"><![CDATA[
    domodlib('repSystem')
        local points, lastName, action = rep.getPoints(cid), getPlayerStorageValue(cid, rep.lastName), false
        doPlayerSendTextMessage(cid, 19, 'You have ' .. rep.formatNum(points, ",")  .. ' reputation points. You are ' .. rep.getRank(points) .. '\nYour Rep Power is ' .. rep.getPower(points) ..'. ' .. (getPlayerStorageValue(cid, rep.lastName) ~= -1 and 'You last reputed ' .. getPlayerNameByGUID(lastName) .. '.' or ''))
 
        if points > 4999 and getPlayerSex(cid) == 0 then --female rep+++ queen outfit
                disguise, text, action = {lookType = 331}, "Queen!!", true
        elseif points > 4999 and getPlayerSex(cid) > 0 then --male rep+++ king outfit
                disguise, text, action = {lookType = 332}, "King!!", true
        elseif points > 2499 then --rep++ cm outfit
                disguise, text, action = {lookType = 306}, "Legend!!", true
        elseif points > 1499 then --rep+ hero outfit
                disguise, text, action = {lookType = 73}, "Hero!!", true
        elseif points < -4999 and getPlayerSex(cid) == 0 then --rep*** female outfit
                disguise, text, action = {lookType = 312}, "DarkLord!!", true
    elseif points < -4999 and getPlayerSex(cid) > 0 then --rep*** male outfit
                disguise, text, action = {lookType = 287}, "DarkLord!!", true
        elseif points < -2499  then --rep** pig outfit --
                disguise, text, action = {lookType = 300}, "Morte!!", true
        elseif points < -1499 then --rep* orc outfit --
                disguise, text, action = {lookType = 194}, "Gangster!!", true
        end
        
        if action and getCreatureOutfit(cid).lookType ~= disguise.lookType then
            doSetCreatureOutfit(cid, disguise, -1)
            doSendAnimatedText(getCreaturePosition(cid), text, math.random(1,255))
        return true
        end    
    return true]]>
</talkaction>
       
<talkaction words="!hail;!fuck" event="buffer"><![CDATA[
    domodlib('repSystem')
        if param == '' then
            doPlayerSendCancel(cid, 'Command requires a player\'s name.')
        return true
        end
       
        local target, oldTime = getPlayerByName(param), getPlayerStorageValue(cid, rep.lastTime)
    
        if not isPlayer(target) then
            doPlayerSendCancel(cid, 'That player does not exist or is offline.')
        return true
        end
    
        if oldTime == -1 then
            setPlayerStorageValue(cid, rep.lastTime, os.time())
        end
                                   
        if getPlayerLevel(cid) < rep.minLevel then
            doPlayerSendCancel(cid,'You may repute from level ' .. rep.minLevel ..' onwards.')
        return true
        end
       
        if getPlayerGUID(target) == getPlayerStorageValue(cid, rep.lastName) then
            doPlayerSendCancel(cid, 'You may not repute that player two times in a row.')  
        return true
        end
    
        if (os.time() - oldTime) < rep.interval then
            doPlayerSendCancel(cid, 'You may repute in ' .. rep.getTime(oldTime - os.time()) .. ' [' .. os.date("%b.%d %X", oldTime + rep.interval) ..']')
        return true
        end
                    
        if getPlayerIp(cid) == getPlayerIp(target) then
            doPlayerSendCancel(cid, 'You may not repute neither yourself nor someone in your IP.')  
        return true
        end
                
        if words == '!hail' then
            setPlayerStorageValue(cid, rep.lastName, getPlayerGUID(target))
            rep.add(target, rep.getPower(cid), TEXTCOLOR_LIGHTBLUE)
            setPlayerStorageValue(cid, rep.lastTime, os.time())
            doPlayerSendCancel(cid, 'You have just reputed ' .. getCreatureName(target))
        elseif words == '!fuck' then
            setPlayerStorageValue(cid, rep.lastName, getPlayerGUID(target))
            rep.remove(target, rep.getPower(cid), TEXTCOLOR_RED)
            setPlayerStorageValue(cid, rep.lastTime, os.time())
            doPlayerSendCancel(cid, 'You have just reputed ' .. getCreatureName(target))
        end
    return true]]>
</talkaction>

 

actions/scripts/rep/rep5.lua

function onUse(cid, item, frompos, item2, topos)


local config = {
repNeeded = 5000
}

if getRepPoints(cid) >= config.repNeeded then
pos = getPlayerPosition(cid)

if pos.x == topos.x then
if pos.y < topos.y then
pos.y = topos.y + 1
else
pos.y = topos.y - 1
end

elseif pos.y == topos.y then
if pos.x < topos.x then
pos.x = topos.x + 1
else
pos.x = topos.x - 1
end
else
doPlayerSendTextMessage(cid,22,'Stay in front of the door.')
return 1
end

doTeleportThing(cid,pos)
doSendMagicEffect(topos,12)
else
doPlayerSendTextMessage(cid,22,"Only players with " .. config.repNeeded .. " reputation can open the chest.")
end
return TRUE
end

 

O problema em que aparece no distro quando tento abrir a porta é esse :

 

[Error - Action Interface]
data/actions/scripts/rep/rep5.lua:onUse
Description:
data/actions/scripts/rep/rep5.lua:6: attempt to call global 'getRepPoints' (a nil value)
stack traceback:
[data/actions/scripts/rep/rep5.lua:6: in function <data/actions/scripts/rep/rep5.lua:1>

 

 

Gostaria que me ajudassem nisso, pois num outro servidor o sistema funcionava perfeitamente... Pode ser um erro mínimo meu que não prestei atenção, mas não encontrei...

 

Agradeço a atenção e fico no aguardo!

Editado por Fakeownerz (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Ele não está encontrando a função getRepPoints, tem certeza que adicionou corretamente o sistema de rep ao seu servidor?

 

PS: Seu script da pasta Mods está igual ao da action.

Editado por Wakon (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Tu colocaste o mesmo script em ambos os spoilers..

                                                                     Ajudei? De nada \o/                                            Att Rusherzin

Link para o post
Compartilhar em outros sites

Tenta usar a action assim:

function onUse(cid, item, frompos, item2, topos)
local config = {
repNeeded = 5000
}

if rep.getPoints(cid) >= config.repNeeded then
pos = getPlayerPosition(cid)

if pos.x == topos.x then
if pos.y < topos.y then
pos.y = topos.y + 1
else
pos.y = topos.y - 1
end

elseif pos.y == topos.y then
if pos.x < topos.x then
pos.x = topos.x + 1
else
pos.x = topos.x - 1
end
else
doPlayerSendTextMessage(cid,22,'Stay in front of the door.')
return 1
end

doTeleportThing(cid,pos)
doSendMagicEffect(topos,12)
else
doPlayerSendTextMessage(cid,22,"Only players with " .. config.repNeeded .. " reputation can open the chest.")
end
return TRUE
end

E no final do seu mod falta fechar a função <mod, não sei se está assim no seu também, se estiver coloque </mod> na ultima linha do script.

Link para o post
Compartilhar em outros sites

Tenta usar a action assim:

function onUse(cid, item, frompos, item2, topos)
local config = {
repNeeded = 5000
}

if rep.getPoints(cid) >= config.repNeeded then
pos = getPlayerPosition(cid)

if pos.x == topos.x then
if pos.y < topos.y then
pos.y = topos.y + 1
else
pos.y = topos.y - 1
end

elseif pos.y == topos.y then
if pos.x < topos.x then
pos.x = topos.x + 1
else
pos.x = topos.x - 1
end
else
doPlayerSendTextMessage(cid,22,'Stay in front of the door.')
return 1
end

doTeleportThing(cid,pos)
doSendMagicEffect(topos,12)
else
doPlayerSendTextMessage(cid,22,"Only players with " .. config.repNeeded .. " reputation can open the chest.")
end
return TRUE
end

E no final do seu mod falta fechar a função <mod, não sei se está assim no seu também, se estiver coloque </mod> na ultima linha do script.

 

O erro persiste, mas mudou pouca coisa nele.

 

 

[21/03/2015 22:35:43] [Error - Action Interface]

[21/03/2015 22:35:43] data/actions/scripts/rep/rep2.lua:onUse

[21/03/2015 22:35:43] Description:

[21/03/2015 22:35:43] data/actions/scripts/rep/rep2.lua:6: attempt to index global 'rep' (a nil value)

[21/03/2015 22:35:43] stack traceback:

[21/03/2015 22:35:43]     data/actions/scripts/rep/rep2.lua:6: in function <data/actions/scripts/rep/rep2.lua:1>

 

 

Quanto ao mod, eu esqueci de copiar, mas ele está fechado sim.

 

ps: os scripts so mudam os valores, ou seja, o rep5 que coloquei no spoil da action é igual ao rep2 do erro.

Link para o post
Compartilhar em outros sites
  • Solução

Mude isso if getRepPoints(cid) >= config.repNeeded then pra isso if getPoints(cid) >= config.repNeeded then

Ou mude o nome da função no MOD.

 

Caso não funcione, adicione isso em lib/0-50function.lua

function getRepPoints(cid)   -- Rep System
local Info = db.getResult("SELECT `rep` FROM `players` WHERE `id` = " .. getPlayerGUID(cid) .. " LIMIT 1")
    local p = Info:getDataInt("rep")
    Info:free()
    return p
end
Editado por joadson (veja o histórico de edições)

Te ajudei?
Se você achar que eu mereço, me dê uma "rep+" e selecione meu post como "melhor resposta"

 

Skype: JoadsonAion

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo