Ir para conteúdo
  • 0

kttallan

Pergunta

Olá pessoal eu estava fazendo um sisteminha aqui para meu servidor porém eu tive um erro relacionado a tabela, gostaria da ajuda de vocês para conseguir concerta-lo se possivel uma explicação do motivo desse erro.

[31/05/2016 09:19:18] [Error - Npc interface] [31/05/2016 09:19:18] data/npc/scripts/DayCarre.lua:onCreatureSay[31/05/2016 09:19:18] Description: [31/05/2016 09:19:18] data/npc/scripts/DayCarre.lua:20: attempt to index global 'item' (a nil value)[31/05/2016 09:19:18] stack traceback:[31/05/2016 09:19:18]     data/npc/scripts/DayCarre.lua:20: in function <data/npc/scripts/DayCarre.lua:12>
Spoiler

function onCreatureTurn(creature)
end

function msgcontains(txt, str)
return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)'))
end

local talkState = {}
local focus = 0
local talk_start = 0

function onCreatureSay(cid, type, msg)
local msg = string.lower(msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

local tables = {
[12127] = {preco = 10, storage = 1212, storagese = 1213, tempo = 24 * 60 * 60, pokemon = "Arcanine"}
}

local tb = tables[item.itemid]
local temp = os.time() + tb.tempo

if not (getDistanceToCreature(cid) <= 3) then
    return true
end

if msgcontains(string.lower(msg), 'hi') then
    if focus ~= 0 and focus ~= cid then
       selfSay(getCreatureName(cid) .. ' aguarde...')
       return true
    else
        focus = cid
        talk_start = os.clock()
    end
end

        if msgcontains(string.lower(msg), 'hi') then            
                selfSay('Oi! Voce deseja {checar}, {entregar} ou {retirar}?')
                talkState[talkUser] = 1
                
        elseif msgcontains(string.lower(msg), 'checar') and talkState[talkUser] == 1 then
            if getPlayerStorageValue(cid, tb.storage) < temp then
                selfSay('Seu pokemon ja esta pronto.')
            else    
                selfSay('Ainda falta [' .. getPlayerStorageValue(cid, tb.storage) < temp ..'], Para seu pokemon esta pronto')
                talkState[talkUser] = 0                
                focus = 0
                tchau = true
            end
            
        elseif msgcontains(string.lower(msg), 'entregar') and talkState[talkUser] == 1 then
            if getPlayerStorageValue(cid, tb.storagese) > 1 then
                selfSay('Voce já tem um ovo comigo, espere terminar')    
            return true end
            
            if getPlayerItemCount(cid, 2160) < tb.preco then
                selfSay('Voce nao tem dinheiro necessesario para compeltar essa acao')    
            return true end
            
            if getPlayerItemCount(cid, tb) < 1 then
                selfSay('Voce nao tem nenhum ovo listado')    
            return true end
            
                doPlayerRemoveItem(cid, tb, 1)
                setPlayerStorageValue(cid, tb.storage, temp)                
                setPlayerStorageValue(cid, tb.storagese, 1)
                selfSay('Seu ovo estara pronto em breve, toda vez que possivel cheque o ovo para acompanhar o progresso!')
                talkState[talkUser] = 0
                focus = 0
                tchau = true
                
        elseif msgcontains(string.lower(msg), 'retirar') and talkState[talkUser] == 1 then        
            if getPlayerStorageValue(cid, tb.storage) < temp then        
                setPlayerStorageValue(cid, tb.storagese, -1)
                addPokeToPlayer(cid, tb.pokemon, 0)
                selfSay('Uau, seu ovo foi chocado parabens agora voce tem um ' ..tb.pokemon..'.')
                talkState[talkUser] = 0
                focus = 0
                tchau = true                
                return true
        end
        
    if tchau then
            tchau = false
            doCreatureSetLookDir(getThis(), lookNpcDir)
            selfSay('Tchau.')
        end
end
end

function onThink()
    if focus  ~= 0 then
        if getDistanceToCreature(focus) > 3 then
            tchau = true
            focus = 0
        end

        if (os.clock() - talk_start) > 15 then
            if focus > 0 then
                tchau = true
                focus = 0
            end
        end
        doNpcSetCreatureFocus(focus)
    end

        if tchau then
            tchau = false
            selfSay('Tchau.')
        end
end

 

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

@kttallan, pelo que dá pra entender, nessa linha você está qrnd pegar o id de um item.

local tb = tables[item.itemid]

Sendo que você está usando um parâmetro (item) que não possui nenhum valor atribuído.

Faria sentido utilizar essa linha se o script fosse um action. Eis o porquê:

Citar

function onUse(cid, item)

Como você pode ver, aqui se vc utilizar o parâmetro item em algum lugar do script (action), ele terá um valor que terá sido pego automaticamente no momento em que o script foi acionado.

Porém você está utilizando um onCreatureSay, e nesse tipo de evento, não é possível utilizar o parâmetro item.
Vc terá que arranjar alguma outra forma de capturar o id do item X que vc tá qrnd.

Não sei se me fiz entender, mas espero que sim... sahusahusahu


possível solução:
Já que na tabela tables vc tá usando só 1 elemento, acredito que usar isso não irá te trazer problemas:

for k, v in pairs(tables) do
	if getPlayerItemCount(cid, k) > 0 then
		..etc etc..
	end
end

 

Link para o comentário
Compartilhar em outros sites

  • 0

Entendo muito obrigado vou tentar refaze-lo em breve, outra eu gostaria de saber como faço para oque o player falar ficar na tabela exemplo.

 

local table = {

["Arcanine"] = {}

}

 

local tb = table[msg]

 

Está certo a forma que executo.

 

Link para o comentário
Compartilhar em outros sites

  • 0

@kttallan, dessa forma você estaria fazendo um arrodeio desnecessário.

Observe uma forma mais sucinta e prática:

 local table = {
["Arcanine"] = {}
}

for k, v in pairs(table) do
	if msgcontains(msg, k) then
		..etc etc..
	end
end



Eu fiz um npc um tempo atrás utilizando esse mesmo princípio:
http://www.xtibia.com/forum/topico/240211-npc-que-dá-informaçõesconta-histórias/

 

Dá uma olhada nos códigos dele pra vc ver como é que funcionaria a execução prática disso.

 

Link para o comentário
Compartilhar em outros sites

  • 0

Bom eu atualizei o script de acordo com as informações que você me passou, porém continua dando erro só que diferentes.

 

Nº 1

[01/06/2016 16:28:12] [Error - Npc interface] [01/06/2016 16:28:12] data/npc/scripts/DayCarre.lua:onCreatureSay[01/06/2016 16:28:12] Description: [01/06/2016 16:28:12] data/npc/scripts/DayCarre.lua:41: attempt to perform arithmetic on field 'time' (a nil value)[01/06/2016 16:28:12] stack traceback:[01/06/2016 16:28:12] 	data/npc/scripts/DayCarre.lua:41: in function <data/npc/scripts/DayCarre.lua:12>

Nº 2

[01/06/2016 16:28:12] [Error - Npc interface] [01/06/2016 16:28:12] data/npc/scripts/DayCarre.lua:onCreatureSay[01/06/2016 16:28:12] Description: [01/06/2016 16:28:12] data/npc/scripts/DayCarre.lua:41: attempt to perform arithmetic on field 'time' (a nil value)[01/06/2016 16:28:12] stack traceback:[01/06/2016 16:28:12] 	data/npc/scripts/DayCarre.lua:41: in function <data/npc/scripts/DayCarre.lua:12>

 

Codigo Atualizado.

 

 



function onCreatureTurn(creature)
end

function msgcontains(txt, str)
return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)'))
end

local talkState = {}
local focus = 0
local talk_start = 0

function onCreatureSay(cid, type, msg)

local msg = string.lower(msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid


local table = {
["Arcanine"] = {price = 10, storages = 1212, storagese = 1213, time = 24 * 60 * 60, egg_ID = 12127}
}


    if not (getDistanceToCreature(cid) <= 3) then return true end

    if msgcontains(string.lower(msg), 'hi') then
        if focus ~= 0 and focus ~= cid then
            selfSay(getCreatureName(cid) .. ' aguarde...')
            return true
        else
            focus = cid
            talk_start = os.clock()
        end
    end

    if msgcontains(string.lower(msg), 'hi') then            
        selfSay('Oi! Voce deseja {checar}, {entregar} ou {retirar}?')
        talkState[talkUser] = 1            
        
    elseif msgcontains(string.lower(msg), 'checar') and talkState[talkUser] == 1 then
        for k, v in pairs(table) do
                temp = os.time() + k.time            
        if not getPlayerStorageValue(cid, k.storage) == 0 then
            selfSay('Voce não tem nenhum ovo comigo')
            return true
            end
    
            if getPlayerStorageValue(cid, k.storage) < temp then
                selfSay('Seu pokemon ja esta pronto.')
            else    

                selfSay('Ainda falta [' .. getPlayerStorageValue(cid, k.storage) < temp ..'], Para seu pokemon esta pronto')
                talkState[talkUser] = 0                
                focus = 0
                tchau = true
            end
end        
    elseif msgcontains(string.lower(msg), 'entregar') and talkState[talkUser] == 1 then
                selfSay('Voce deseja entregar que ovo?') 
                talkState[talkUser] = 2
        for k, v in pairs(table) do    
            if msgcontains(string.lower(msg), k) and talkState[talkUser] == 2 then
            
            if getPlayerStorageValue(cid, k.storagese) > 1 then
                selfSay('Voce já tem um ovo comigo, espere terminar')    
                return true 
            end
                
            if getPlayerItemCount(cid, 2160) < k.preco then
                selfSay('Voce nao tem dinheiro necessesario para compeltar essa acao')    
                return true
            end
            
            temp = os.time() + k.tempo    
            doPlayerRemoveItem(cid, k.egg_ID, 1)
            setPlayerStorageValue(cid, k.storage, temp)                
            setPlayerStorageValue(cid, k.storagese, 1)
            selfSay('Seu ovo estara pronto em breve, toda vez que possivel cheque o ovo para acompanhar o progresso!')
            talkState[talkUser] = 0
            focus = 0
            tchau = true
        else
            selfSay('Voce nao tem nenhum ovo listado')    
            return true
    end    
end        

    elseif msgcontains(string.lower(msg), 'retirar') and talkState[talkUser] == 1 then
        for k, v in pairs(table) do
            if getPlayerStorageValue(cid, k.storage) < temp then        
                setPlayerStorageValue(cid, k.storagese, -1)
                addPokeToPlayer(cid, k.pokemon, 0)
                selfSay('Uau, seu ovo foi chocado parabens agora voce tem um ' ..k.pokemon..'.')
                talkState[talkUser] = 0
                focus = 0
                tchau = true                
                return true
            end
        end
            
        if tchau then
            tchau = false
            doCreatureSetLookDir(getThis(), lookNpcDir)
            selfSay('Tchau.')
        end
    end
end

function onThink()
    if focus  ~= 0 then
        if getDistanceToCreature(focus) > 3 then
            tchau = true
            focus = 0
        end

        if (os.clock() - talk_start) > 15 then
            if focus > 0 then
                tchau = true
                focus = 0
            end
        end
    doNpcSetCreatureFocus(focus)
    end

    if tchau then
        tchau = false
        selfSay('Tchau.')
    end
end

 

Link para o comentário
Compartilhar em outros sites

  • 0

@kttallan, o erro está se dando pq vc não está conseguindo acessar (da forma correta) o valor desejado.

Temos a seguinte tabela:

local table = {
["Arcanine"] = {price = 10, storages = 1212, storagese = 1213, time = 24 * 60 * 60, egg_ID = 12127}
}

Se você rodar o seguinte código:

local table = {
["Arcanine"] = {price = 10, storages = 1212, storagese = 1213, time = 24 * 60 * 60, egg_ID = 12127}
}

for k, v in pairs(table) do
	print(k)
end

O console mostrará o valor de k. O resultado seria o seguinte:

Citar

Arcanine

*ou seja, mostrará o "identificador" do elemento componente da tabela.

 

Se você rodar, o seguinte código:

local table = {
["Arcanine"] = {price = 10, storages = 1212, storagese = 1213, time = 24 * 60 * 60, egg_ID = 12127}
}


for k, v in pairs(table) do
	print(k.time)
end

O resultado será o seguinte:

Citar

nil

*ou seja, você não conseguiu acessar o valor desejado.

 

 

Agora, se você rodar o seguinte código:

local table = {
["Arcanine"] = {price = 10, storages = 1212, storagese = 1213, time = 24 * 60 * 60, egg_ID = 12127}
}


for k, v in pairs(table) do
	print(table[k].time)
end

O resultado será o seguinte:

Citar

86400

*ou seja, aqui você conseguirá acessar o valor desejado.


 

Explicação na prática:

Se você usar k.time em qualquer parte do código, ele terá o valor nil. Porém, se você utilizar table[k].time ele terá o valor da variável time do elemento k da tabela.

Link para o comentário
Compartilhar em outros sites

  • 0

Velho você não sabe o quanto está me ajudando, é meu primeiro NPC que crio :/

 

Erro:

 

[01/06/2016 20:52:22] [Error - Npc interface] [01/06/2016 20:52:22] data/npc/scripts/Daycarre.lua:onCreatureSay[01/06/2016 20:52:22] Description: [01/06/2016 20:52:22] data/npc/scripts/Daycarre.lua:5: bad argument #2 to 'find' (string expected, got table)[01/06/2016 20:52:22] stack traceback:[01/06/2016 20:52:22]     [C]: in function 'find'[01/06/2016 20:52:22]     data/npc/scripts/Daycarre.lua:5: in function 'msgcontains'[01/06/2016 20:52:22]     data/npc/scripts/Daycarre.lua:61: in function <data/npc/scripts/Daycarre.lua:12>

 

 

Codigo:

 

 



function onCreatureTurn(creature)
end

function msgcontains(txt, str)
return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)'))
end

local talkState = {}
local focus = 0
local talk_start = 0

function onCreatureSay(cid, type, msg)

local msg = string.lower(msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid


local table = {
["Arcanine"] = {price = 10, storages = 1212, pokemon = "Arcanine", storagese = 1213, time = 24 * 60 * 60, egg_ID = 12127}
}


    if not (getDistanceToCreature(cid) <= 3) then return true end

    if msgcontains(string.lower(msg), 'hi') then
        if focus ~= 0 and focus ~= cid then
            selfSay(getCreatureName(cid) .. ' aguarde...')
            return true
        else
            focus = cid
            talk_start = os.clock()
        end
    end

    if msgcontains(string.lower(msg), 'hi') then            
        selfSay('Oi! Voce deseja {checar}, {entregar} ou {retirar}?')
        talkState[talkUser] = 1            
        
    elseif msgcontains(string.lower(msg), 'checar') and talkState[talkUser] == 1 then
        for k, v in pairs(table) do
                temp = os.time() + table[k].time            
        if not getPlayerStorageValue(cid, table[k].storage) == 0 then
            selfSay('Voce não tem nenhum ovo comigo')
            return true
            end
    
            if getPlayerStorageValue(cid, table[k].storage) < temp then
                selfSay('Seu pokemon ja esta pronto.')
            else    

                selfSay('Ainda falta [' .. getPlayerStorageValue(cid, table[k].storage) < temp ..'], Para seu pokemon esta pronto')
                talkState[talkUser] = 0                
                focus = 0
                tchau = true
            end
end        
    elseif msgcontains(string.lower(msg), 'entregar') and talkState[talkUser] == 1 then
                selfSay('Voce deseja entregar que ovo?') 
                talkState[talkUser] = 2
        for k, v in pairs(table) do    
            if msgcontains(string.lower(msg), table[k]) and talkState[talkUser] == 2 then
            
            if getPlayerStorageValue(cid, table[k].storagese) > 1 then
                selfSay('Voce já tem um ovo comigo, espere terminar')    
                return true 
            end
                
            if getPlayerItemCount(cid, 2160) < table[k].preco then
                selfSay('Voce nao tem dinheiro necessesario para compeltar essa acao')    
                return true
            end
            
            temp = os.time() + table[k].tempo    
            doPlayerRemoveItem(cid, table[k].egg_ID, 1)
            setPlayerStorageValue(cid, table[k].storage, temp)                
            setPlayerStorageValue(cid, table[k].storagese, 1)
            selfSay('Seu ovo estara pronto em breve, toda vez que possivel cheque o ovo para acompanhar o progresso!')
            talkState[talkUser] = 0
            focus = 0
            tchau = true
        else
            selfSay('Voce nao tem nenhum ovo listado')    
            return true
    end    
end        

    elseif msgcontains(string.lower(msg), 'retirar') and talkState[talkUser] == 1 then
        for k, v in pairs(table) do
            if getPlayerStorageValue(cid, table[k].storage) < temp then        
                setPlayerStorageValue(cid, table[k].storagese, -1)
                addPokeToPlayer(cid, table[k].pokemon, 0)
                selfSay('Uau, seu ovo foi chocado parabens agora voce tem um ' ..table[k].pokemon..'.')
                talkState[talkUser] = 0
                focus = 0
                tchau = true                
                return true
            end
        end
            
        if tchau then
            tchau = false
            doCreatureSetLookDir(getThis(), lookNpcDir)
            selfSay('Tchau.')
        end
    end
end

function onThink()
    if focus  ~= 0 then
        if getDistanceToCreature(focus) > 3 then
            tchau = true
            focus = 0
        end

        if (os.clock() - talk_start) > 15 then
            if focus > 0 then
                tchau = true
                focus = 0
            end
        end
    doNpcSetCreatureFocus(focus)
    end

    if tchau then
        tchau = false
        selfSay('Tchau.')
    end
end

 

Link para o comentário
Compartilhar em outros sites

  • 0

sauhsahu, de boas.

Só tenho 1 pergunta... Pq você tá refazendo a função msgcontains (justamente nela que deu o erro agr)? Ela não existe no teu server ñ?

Enfim, vê se dá certo:

Spoiler
function onCreatureTurn(creature)endfunction msgcontains(txt, str)	if(type(str) == "table") then		return isInArray(str, txt)	end	local a, b = txt:lower(), str:lower()	if(str == txt) then		return true	end	return txt:find(str) and not txt:find('(%w+)' .. str)endlocal talkState = {}local focus = 0local talk_start = 0function onCreatureSay(cid, type, msg)local msg = string.lower(msg)local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cidlocal table = {["Arcanine"] = {price = 10, storages = 1212, pokemon = "Arcanine", storagese = 1213, time = 24 * 60 * 60, egg_ID = 12127}}    if not (getDistanceToCreature(cid) <= 3) then return true end    if msgcontains(string.lower(msg), 'hi') then        if focus ~= 0 and focus ~= cid then            selfSay(getCreatureName(cid) .. ' aguarde...')            return true        else            focus = cid            talk_start = os.clock()        end    end    if msgcontains(string.lower(msg), 'hi') then                    selfSay('Oi! Voce deseja {checar}, {entregar} ou {retirar}?')        talkState[talkUser] = 1                        elseif msgcontains(string.lower(msg), 'checar') and talkState[talkUser] == 1 then        for k, v in pairs(table) do                temp = os.time() + table[k].time                    if not getPlayerStorageValue(cid, table[k].storage) == 0 then            selfSay('Voce não tem nenhum ovo comigo')            return true            end                if getPlayerStorageValue(cid, table[k].storage) < temp then                selfSay('Seu pokemon ja esta pronto.')            else                    selfSay('Ainda falta [' .. getPlayerStorageValue(cid, table[k].storage) < temp ..'], Para seu pokemon esta pronto')                talkState[talkUser] = 0                                focus = 0                tchau = true            endend            elseif msgcontains(string.lower(msg), 'entregar') and talkState[talkUser] == 1 then                selfSay('Voce deseja entregar que ovo?')                 talkState[talkUser] = 2        for k, v in pairs(table) do                if msgcontains(string.lower(msg), table[k]) and talkState[talkUser] == 2 then                        if getPlayerStorageValue(cid, table[k].storagese) > 1 then                selfSay('Voce já tem um ovo comigo, espere terminar')                    return true             end                            if getPlayerItemCount(cid, 2160) < table[k].preco then                selfSay('Voce nao tem dinheiro necessesario para compeltar essa acao')                    return true            end                        temp = os.time() + table[k].tempo                doPlayerRemoveItem(cid, table[k].egg_ID, 1)            setPlayerStorageValue(cid, table[k].storage, temp)                            setPlayerStorageValue(cid, table[k].storagese, 1)            selfSay('Seu ovo estara pronto em breve, toda vez que possivel cheque o ovo para acompanhar o progresso!')            talkState[talkUser] = 0            focus = 0            tchau = true        else            selfSay('Voce nao tem nenhum ovo listado')                return true    end    end            elseif msgcontains(string.lower(msg), 'retirar') and talkState[talkUser] == 1 then        for k, v in pairs(table) do            if getPlayerStorageValue(cid, table[k].storage) < temp then                        setPlayerStorageValue(cid, table[k].storagese, -1)                addPokeToPlayer(cid, table[k].pokemon, 0)                selfSay('Uau, seu ovo foi chocado parabens agora voce tem um ' ..table[k].pokemon..'.')                talkState[talkUser] = 0                focus = 0                tchau = true                                return true            end        end                    if tchau then            tchau = false            doCreatureSetLookDir(getThis(), lookNpcDir)            selfSay('Tchau.')        end    endendfunction onThink()    if focus  ~= 0 then        if getDistanceToCreature(focus) > 3 then            tchau = true            focus = 0        end        if (os.clock() - talk_start) > 15 then            if focus > 0 then                tchau = true                focus = 0            end        end    doNpcSetCreatureFocus(focus)    end    if tchau then        tchau = false        selfSay('Tchau.')    endend 

 

 

Link para o comentário
Compartilhar em outros sites

  • 0
16 horas atrás, kttallan disse:

 for k, v in pairs(table) do

                temp = os.time() + k.time 

 

For em lua é um loop e pairs é um iterator.

Quando usado o iterator no loop for, retornar-se dois valores,  o index (k) e o valor atribuido ao index (v).

Acessar a tabela na qual está acessando o loop com o iterator pelo caminho, é um mal exemplo de programação. 

 

Nao faça isso:

Citar

table[k].tempo

 

Faça isso:

Citar

v.tempo

 

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pessoal por está me ajudando, eu já desisti do npc porém estou postando o erros por questão de conhecimento.

 

A parte em vermelha não está executando.

 

Extra: O npc funciona da seguinte forma para os que tentão me ajudar mais não estão sabendo oque ele faz, você fala com ele terá 3 opções checar, entregar, retirar.

 

Checar = Checa sé o player ainda tem a storage com os.time, caso tenha será mandando uma mensagem informando quanto tempo falta para ficar pronto o ovo.

Entregar = Será removido o item(ovo) e adicionado a storage do os.time e storage de segurança (storagese), será removido uma quantidade de dinheiro também.

Retirar = Quando o player não estiver mais com a storage do os.time será retirado o ovo e removido a storage de segurança.

 

 

 



function onCreatureTurn(creature)
end

function msgcontains(txt, str)
    if(type(str) == "table") then
        return isInArray(str, txt)
    end

    local a, b = txt:lower(), str:lower()
    if(str == txt) then
        return true
    end

    return txt:find(str) and not txt:find('(%w+)' .. str)
end

local talkState = {}
local focus = 0
local talk_start = 0

function onCreatureSay(cid, type, msg)

local msg = string.lower(msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid


local table = {
["Arcanine"] = {price = 10, storages = 1212, pokemon = "Arcanine", storagese = 1213, time = 24 * 60 * 60, egg_ID = 12127}
}


    if not (getDistanceToCreature(cid) <= 3) then return true end

    if msgcontains(string.lower(msg), 'hi') then
        if focus ~= 0 and focus ~= cid then
            selfSay(getCreatureName(cid) .. ' aguarde...')
            return true
        else
            focus = cid
            talk_start = os.clock()
        end
    end

    if msgcontains(string.lower(msg), 'hi') then            
        selfSay('Oi! Voce deseja {checar}, {entregar} ou {retirar}?')
        talkState[talkUser] = 1            
        
    elseif msgcontains(string.lower(msg), 'checar') and talkState[talkUser] == 1 then
        for k, v in pairs(table) do
                temp = os.time() + v.time            
        if not getPlayerStorageValue(cid, v.storage) == 0 then
            selfSay('Voce não tem nenhum ovo comigo')
            return true
            end
    
            if getPlayerStorageValue(cid, v.storage) < temp then
                selfSay('Seu pokemon ja esta pronto.')
            else    

                selfSay('Ainda falta [' .. getPlayerStorageValue(cid, v.storage) < temp ..'], Para seu pokemon esta pronto')
                talkState[talkUser] = 0                
                focus = 0
                tchau = true
            end
end        
    elseif msgcontains(string.lower(msg), 'entregar') and talkState[talkUser] == 1 then
                selfSay('Voce deseja entregar que ovo?') 
                talkState[talkUser] = 2
                
        for k, v in pairs(table) do    
            if msgcontains(string.lower(msg), k) and talkState[talkUser] == 2 then      
                if getPlayerStorageValue(cid, v.storagese) > 1 then
                    selfSay('Voce já tem um ovo comigo, espere terminar')    
                    return true 
                end
                
            if getPlayerItemCount(cid, 2160) < v.preco then
                selfSay('Voce nao tem dinheiro necessesario para compeltar essa acao')    
                return true
            end
            
            temp = os.time() + v.time    
            doPlayerRemoveItem(cid, v.egg_ID, 1)
            setPlayerStorageValue(cid, v.storage, temp)                
            setPlayerStorageValue(cid, v.storagese, 1)
            selfSay('Seu ovo estara pronto em breve, toda vez que possivel cheque o ovo para acompanhar o progresso!')
            talkState[talkUser] = 0
            focus = 0
            tchau = true
            print('funfo')
            return true
    end    

end        

    elseif msgcontains(string.lower(msg), 'retirar') and talkState[talkUser] == 1 then
        for k, v in pairs(table) do
        
    if not getPlayerStorageValue(cid, v.storage) == 0 then
            selfSay('Voce não tem nenhum ovo comigo')
            return true
            end
            temp = os.time() + v.time            
            if getPlayerStorageValue(cid, v.storage) < temp then        
                setPlayerStorageValue(cid, v.storagese, -1)
                addPokeToPlayer(cid, v.pokemon, 0)
                selfSay('Uau, seu ovo foi chocado parabens agora voce tem um ' ..v.pokemon..'.')
                talkState[talkUser] = 0
                focus = 0
                tchau = true                
                return true
            end
        end
            
        if tchau then
            tchau = false
            doCreatureSetLookDir(getThis(), lookNpcDir)
            selfSay('Tchau.')
        end
    end
end

function onThink()
    if focus  ~= 0 then
        if getDistanceToCreature(focus) > 3 then
            tchau = true
            focus = 0
        end

        if (os.clock() - talk_start) > 15 then
            if focus > 0 then
                tchau = true
                focus = 0
            end
        end
    doNpcSetCreatureFocus(focus)
    end

    if tchau then
        tchau = false
        selfSay('Tchau.')
    end
end 

 

Link para o comentário
Compartilhar em outros sites

  • 0

Esse escopo não está sendo executado por causa dessa condição:

Citar

if msgcontains(string.lower(msg), k) and talkState[talkUser] == 2 then 

 

Mais especificamente aqui:

Citar

 msgcontains(string.lower(msg), k)

 

Ela não está sendo executada,  porquê você está tentando encontrar a mensagem (nesse caso seria: "entregar") nos index da array 'tabela', na qual não tem o index: "entregar".

Citar

local table = {
["Arcanine"] = {price = 10, storages = 1212, pokemon = "Arcanine", storagese = 1213, time = 24 * 60 * 60, egg_ID = 12127}

 

Link para o comentário
Compartilhar em outros sites

  • 0

@kttallan, vê se resolve:

Spoiler

function onCreatureTurn(creature)
end

function msgcontains(txt, str)
    if(type(str) == "table") then
        return isInArray(str, txt)
    end

    local a, b = txt:lower(), str:lower()
    if(str == txt) then
        return true
    end

    return txt:find(str) and not txt:find('(%w+)' .. str)
end

local talkState = {}
local focus = 0
local talk_start = 0

function onCreatureSay(cid, type, msg)

local msg = string.lower(msg)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid


local table = {
["Arcanine"] = {price = 10, storages = 1212, pokemon = "Arcanine", storagese = 1213, time = 24 * 60 * 60, egg_ID = 12127}
}


    if not (getDistanceToCreature(cid) <= 3) then return true end

    if msgcontains(string.lower(msg), 'hi') then
        if focus ~= 0 and focus ~= cid then
            selfSay(getCreatureName(cid) .. ' aguarde...')
            return true
        else
            focus = cid
            talk_start = os.clock()
        end
    end

    if msgcontains(string.lower(msg), 'hi') then            
        selfSay('Oi! Voce deseja {checar}, {entregar} ou {retirar}?')
        talkState[talkUser] = 1            
        
    elseif msgcontains(string.lower(msg), 'checar') and talkState[talkUser] == 1 then
        for k, v in pairs(table) do
                temp = os.time() + v.time            
        if not getPlayerStorageValue(cid, v.storage) == 0 then
            selfSay('Voce não tem nenhum ovo comigo')
            return true
            end
    
            if getPlayerStorageValue(cid, v.storage) < temp then
                selfSay('Seu pokemon ja esta pronto.')
            else    

                selfSay('Ainda falta [' .. getPlayerStorageValue(cid, v.storage) < temp ..'], Para seu pokemon esta pronto')
                talkState[talkUser] = 0                
                focus = 0
                tchau = true
            end
		end        
    elseif msgcontains(string.lower(msg), 'entregar') and talkState[talkUser] == 1 then
                selfSay('Voce deseja entregar que ovo?') 
                talkState[talkUser] = 2
	elseif msgcontains(string.lower(msg), 'retirar') and talkState[talkUser] == 1 then
        for k, v in pairs(table) do
        
			if not getPlayerStorageValue(cid, v.storage) == 0 then
				selfSay('Voce não tem nenhum ovo comigo')
				return true
            end
            temp = os.time() + v.time            
            if getPlayerStorageValue(cid, v.storage) < temp then        
                setPlayerStorageValue(cid, v.storagese, -1)
                addPokeToPlayer(cid, v.pokemon, 0)
                selfSay('Uau, seu ovo foi chocado parabens agora voce tem um ' ..v.pokemon..'.')
                talkState[talkUser] = 0
                focus = 0
                tchau = true                
                return true
            end
        end
            
        if tchau then
            tchau = false
            doCreatureSetLookDir(getThis(), lookNpcDir)
            selfSay('Tchau.')
        end
		
		
	elseif talkState[talkUser] == 2 then
		for k, v in pairs(table) do    
            if msgcontains(string.lower(msg), k) and talkState[talkUser] == 2 then      
                if getPlayerStorageValue(cid, v.storagese) > 1 then
                    selfSay('Voce já tem um ovo comigo, espere terminar')    
                    return true 
                end
                
            if getPlayerItemCount(cid, 2160) < v.preco then
                selfSay('Voce nao tem dinheiro necessesario para compeltar essa acao')    
                return true
            end
            
            temp = os.time() + v.time    
            doPlayerRemoveItem(cid, v.egg_ID, 1)
            setPlayerStorageValue(cid, v.storage, temp)                
            setPlayerStorageValue(cid, v.storagese, 1)
            selfSay('Seu ovo estara pronto em breve, toda vez que possivel cheque o ovo para acompanhar o progresso!')
            talkState[talkUser] = 0
            focus = 0
            tchau = true
            print('funfo')
            return true
			end
		end
    end
end

function onThink()
    if focus  ~= 0 then
        if getDistanceToCreature(focus) > 3 then
            tchau = true
            focus = 0
        end

        if (os.clock() - talk_start) > 15 then
            if focus > 0 then
                tchau = true
                focus = 0
            end
        end
    doNpcSetCreatureFocus(focus)
    end

    if tchau then
        tchau = false
        selfSay('Tchau.')
    end
end

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

Usa a função string.explode (str, ret)

No caso, o player dirá: "entregar arcaine", a função irá separar as palavras "entregar" e "arcane". Lembre-se que a função (explode) retorna uma tabela, então você tera que acessar seu conteúdo pelos index; exemplo:

Citar

local msg = "entregar arcane"

local t = string.explode (msg," ")

print (t [1]) --> "entregar"

print (t [2]) --> "arcane"

print (t [3]) --> nil

 

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...