Ir para conteúdo
  • Cadastre-se

(Resolvido)NPC que troca varios itens por x item em determinado tempo


Ir para solução Resolvido por FeeTads,

Posts Recomendados

  • Moderador
7 minutos atrás, Strikerzerh disse:

Então mais ele n ta falando... e nao pega e entrega o item, testa ai

faz um videozinho pf, com um char que não fez a troca ainda, e explica o passo a passo

Link para o post
Compartilhar em outros sites
  • Moderador
36 minutos atrás, Strikerzerh disse:

image.thumb.png.6b76db5de25f75de47c6adddbd10ebfd.png

o 1 minuto é pq eu editei pra ir mais rapido

essa parte do 10kk é pq eu nao mudei a fala do npc

esse ai é um char novo e n tinha nada na mochila

não entendi, aonde esta faltando?

Link para o post
Compartilhar em outros sites
  • Moderador
2 minutos atrás, Strikerzerh disse:

ele me entregou sem eu ter os itens na mochila

sim, pra receber não precisa dos items na BP, precisa ter os items na hora de aceitar a missão.

a não ser que vc modificou e tirou, me manda seu script como ta em spoiler pf

Link para o post
Compartilhar em outros sites

Mais ai q ta em nenhum momento eu coloquei os itens na mochila até pq n teria cap

eu não sei como coloca em spoiler... desculpa

 

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
 
function onCreatureAppear(cid)         npcHandler:onCreatureAppear(cid)         end
function onCreatureDisappear(cid)      npcHandler:onCreatureDisappear(cid)         end
function onCreatureSay(cid, type, msg)   npcHandler:onCreatureSay(cid, type, msg:lower())   end
function onThink()                  npcHandler:onThink()                  end
local talkState = {}

-- function de tempo //NÃO MEXER
local function getTimeString(self)
    local format = {
        {'dia', self / 60 / 60 / 24},
        {'hora', self / 60 / 60 % 24},
        {'minuto', self / 60 % 60},
        {'segundo', self % 60}
    }

    local out = {}
    for k, t in ipairs(format) do
        local v = math.floor(t[2])
        if(v > 0) then
            table.insert(out, (k < #format and (#out > 0 and ', ' or '') or ' e ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or ''))
        end
    end
    local ret = table.concat(out)
    if ret:len() < 16 and ret:find('segundo') then
        local a, b = ret:find(' e ')
        ret = ret:sub(b+1)
    end
    return ret
end


local itemid = {                        -- id dos items necessários pra troca
    [1] = {item = 8976, count = 1},
    [2] = {item = 2350, count = 1},
    [3] = {item = 2160, count = 1000},
}        

local save_items = 0                        -- variavel apenas pra salvar a quantidade de items //nao mexer
local tempo_de_espera = 1                    -- em minutos    
local storage = 58458711                    -- storage //se não souber, não mexer
local storageAceitar = 58458712 
local item_trocado = 10313                    -- id do item que vira após a troca
local trocar_mais_de_uma_vez = false          -- o player pode trocar varias vezes esse 4 items por 1?  //true pode trocar mais de 1x //false só troca uma vez
 
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 msg = string.lower(msg)
    
    if isInArray({"espada", "itens", "lista"}, msg) then
        local lista = ''
        for i=1, #itemid do
            lista = lista..itemid[i].count..' - '..getItemNameById(itemid[i].item)
            if i+1 <= #itemid then
                lista = lista..', '
            end
        end
        selfSay("Onde voce encontrou esta espada quebrada? com ela posso fazer uma poderosa espada, mais vc vai precisar trazer 30 pieces of iron, 30 silver broochs, 1o golden mugs, 1 demonic essence e 10kk. Aceita?", cid)
        talkState[talkUser] = 10
    elseif isInArray({"yes", "aceito", "sim"}, msg) and talkState[talkUser] == 10 then
        selfSay("Otimo, me traga o que te pedi: 30 pieces of iron, 30 silver broochs, 10 golden mugs, 1 demonic essence e 10kk.", cid)
        setPlayerStorageValue(cid, storageAceitar, 1)
        talkState[talkUser] = 0
        npcHandler:releaseFocus(cid)
    elseif isInArray({"espada","troca","trocar"}, msg) then                                -- mensagem do player
        if getPlayerStorageValue(cid, storageAceitar) == 1 then
            local lista = ''
            for i=1, #itemid do
                lista = lista..itemid[i].count..' - '..getItemNameById(itemid[i].item)
                if i+1 <= #itemid then
                    lista = lista..', '
                end
            end
            selfSay("Voce aceita me pagar 10kk pela espada?", cid)                -- msg do NPC
            talkState[talkUser] = 2
        else
            selfSay("Primeiro gostaria de ver a {lista} de itens para me trazer?", cid)
            talkState[talkUser] = 11
        end
    elseif isInArray({"no","não","bye","not"}, msg) and talkState[talkUser] == 11 then
        selfSay("OK, Bye!", cid)
        talkState[talkUser] = 0
        npcHandler:releaseFocus(cid)
    elseif isInArray({"sim","quero","yes","yeah"}, msg) and talkState[talkUser] == 11 then
        local lista = ''
        for i=1, #itemid do
            lista = lista..itemid[i].count..' - '..getItemNameById(itemid[i].item)
            if i+1 <= #itemid then
                lista = lista..', '
            end
        end
        selfSay("A lista de items são: {"..lista.."}", cid)
        selfSay("Você {aceita} pegar esses items?", cid)
        talkState[talkUser] = 10
    elseif isInArray({"sim","quero","yes","yeah"}, msg) and talkState[talkUser] == 2 then
        if trocar_mais_de_uma_vez == false and getPlayerStorageValue(cid, storage) ~= -1 then
            selfSay("Desculpe, voce ja fez sua troca!", cid)
            talkState[talkUser] = 0
            npcHandler:releaseFocus(cid)
            return true
         end
        for i=1, #itemid do                                                                    -- for pra fazer a contagem dos items
            if getPlayerItemCount(cid, itemid[i].item) >= itemid[i].count then                                    -- caso o player tenha o item
                save_items = save_items + 1                                                    -- salva na variavel
            end
        end
        if save_items >= #itemid then                                                        -- se tiver todos os items necessários
            selfSay("Otimo! vai levar 9 horas ate que a espada fique pronta, volte aqui em "..getTimeString(tempo_de_espera*60)..".", cid)        -- manda a mensagem
            setPlayerStorageValue(cid, storage, os.time() + (tempo_de_espera*60))                                            -- seta a storage pra 60 minutos
            for i=1, #itemid do
                doPlayerRemoveItem(cid, itemid[i].item, itemid[i].count)                                                                        -- remove os items do player
            end
        else
            selfSay("Desculpe, mas o senhor nao me trouxe os itens necessarios!", cid)                                    -- mensagem caso não tenha os items necessários
            talkState[talkUser] = 0
            npcHandler:releaseFocus(cid)
        end
    elseif isInArray({"no","não","nao","not"}, msg) and talkState[talkUser] == 2 then                        -- caso o player não queira trocar, só da tchau
         selfSay("Tudo bem então, Bye!", cid)
         talkState[talkUser] = 0
         npcHandler:releaseFocus(cid)
    elseif isInArray({"receber","receber item"}, msg) then                                                            -- caso o player digite "receber"
        if (getPlayerStorageValue(cid, storage) - os.time() <= 0 and getPlayerStorageValue(cid, storage) ~= 0 and getPlayerStorageValue(cid, storage) ~= -1) then -- checa se já passou [tempo de espera], e não é 0
              local new_item = doCreateItemEx(item_trocado, 1)
            local receive = doPlayerAddItemEx(cid, new_item)
            if receive == RETURNVALUE_NOERROR then                                -- caso o player tenha slot na bp, etc..
                selfSay("Sua espada esta pronta, aqui esta!", cid)                                            -- msg do NPC
                setPlayerStorageValue(cid, storage, 0)                                                                -- seta a storage do player pra 0
                talkState[talkUser] = 0
                npcHandler:releaseFocus(cid)
            else
                selfSay("Sua espada esta pronta, deixe espaço em sua mochila!", cid)                                        -- caso não consiga entregar o item só pede pra deixar espaço    
                talkState[talkUser] = 0
                npcHandler:releaseFocus(cid)
            end
        elseif getPlayerStorageValue(cid, storage) - os.time() > 0 then
            selfSay("Sua espada ainda {nao esta pronta}, volte em "..getTimeString((getPlayerStorageValue(cid, storage)-os.time()))..".", cid)    -- caso ainda não esteja pronto o item
            talkState[talkUser] = 0
            npcHandler:releaseFocus(cid)
        elseif getPlayerStorageValue(cid, storage) == 0 then
            selfSay("Desculpe, mas o senhor nao me trouxe os itens necessarios!", cid)    -- caso ainda não esteja pronto o item
            talkState[talkUser] = 0
            npcHandler:releaseFocus(cid)
        end
    end
 
   return true
end
 
 
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

Link para o post
Compartilhar em outros sites
  • Moderador
  • Solução
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
 
function onCreatureAppear(cid)         npcHandler:onCreatureAppear(cid)         end
function onCreatureDisappear(cid)      npcHandler:onCreatureDisappear(cid)         end
function onCreatureSay(cid, type, msg)   npcHandler:onCreatureSay(cid, type, msg:lower())   end
function onThink()                  npcHandler:onThink()                  end
local talkState = {}

-- function de tempo //NÃO MEXER
local function getTimeString(self)
    local format = {
        {'dia', self / 60 / 60 / 24},
        {'hora', self / 60 / 60 % 24},
        {'minuto', self / 60 % 60},
        {'segundo', self % 60}
    }

    local out = {}
    for k, t in ipairs(format) do
        local v = math.floor(t[2])
        if(v > 0) then
            table.insert(out, (k < #format and (#out > 0 and ', ' or '') or ' e ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or ''))
        end
    end
    local ret = table.concat(out)
    if ret:len() < 16 and ret:find('segundo') then
        local a, b = ret:find(' e ')
        ret = ret:sub(b+1)
    end
    return ret
end


local itemid = {                        -- id dos items necessários pra troca
    [1] = {item = 8976, count = 1},
    [2] = {item = 2350, count = 1},
    [3] = {item = 2160, count = 1000},
}        

local save_items = 0                        -- variavel apenas pra salvar a quantidade de items //nao mexer
local tempo_de_espera = 1                    -- em minutos    
local storage = 58458711                    -- storage //se não souber, não mexer
local storageAceitar = 58458712 
local item_trocado = 10313                    -- id do item que vira após a troca
local trocar_mais_de_uma_vez = false          -- o player pode trocar varias vezes esse 4 items por 1?  //true pode trocar mais de 1x //false só troca uma vez
 
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 msg = string.lower(msg)
    
    if isInArray({"espada", "itens", "lista"}, msg) then
        local lista = ''
        for i=1, #itemid do
            lista = lista..itemid[i].count..' - '..getItemNameById(itemid[i].item)
            if i+1 <= #itemid then
                lista = lista..', '
            end
        end
        selfSay("Onde voce encontrou esta espada quebrada? com ela posso fazer uma poderosa espada, mais vc vai precisar trazer 30 pieces of iron, 30 silver broochs, 1o golden mugs, 1 demonic essence e 10kk. Aceita?", cid)
        talkState[talkUser] = 10
    elseif isInArray({"yes", "aceito", "sim"}, msg) and talkState[talkUser] == 10 then
        selfSay("Otimo, me traga o que te pedi: 30 pieces of iron, 30 silver broochs, 10 golden mugs, 1 demonic essence e 10kk.", cid)
        setPlayerStorageValue(cid, storageAceitar, 1)
        talkState[talkUser] = 0
        npcHandler:releaseFocus(cid)
    elseif isInArray({"espada","troca","trocar"}, msg) then                                -- mensagem do player
        if getPlayerStorageValue(cid, storageAceitar) == 1 then
            local lista = ''
            for i=1, #itemid do
                lista = lista..itemid[i].count..' - '..getItemNameById(itemid[i].item)
                if i+1 <= #itemid then
                    lista = lista..', '
                end
            end
            selfSay("Voce aceita me pagar {"..lista.."} pela espada?", cid)                -- msg do NPC
            talkState[talkUser] = 2
        else
            selfSay("Primeiro gostaria de ver a {lista} de itens para me trazer?", cid)
            talkState[talkUser] = 11
        end
    elseif isInArray({"no","não","bye","not"}, msg) and talkState[talkUser] == 11 then
        selfSay("OK, Bye!", cid)
        talkState[talkUser] = 0
        npcHandler:releaseFocus(cid)
    elseif isInArray({"sim","quero","yes","yeah"}, msg) and talkState[talkUser] == 11 then
        local lista = ''
        for i=1, #itemid do
            lista = lista..itemid[i].count..' - '..getItemNameById(itemid[i].item)
            if i+1 <= #itemid then
                lista = lista..', '
            end
        end
        selfSay("A lista de items são: {"..lista.."}", cid)
        selfSay("Você {aceita} pegar esses items?", cid)
        talkState[talkUser] = 10
    elseif isInArray({"sim","quero","yes","yeah"}, msg) and talkState[talkUser] == 2 then
        if trocar_mais_de_uma_vez == false and getPlayerStorageValue(cid, storage) ~= -1 then
            selfSay("Desculpe, voce ja fez sua troca!", cid)
            talkState[talkUser] = 0
            npcHandler:releaseFocus(cid)
            return true
         end
        for i=1, #itemid do                                                                    -- for pra fazer a contagem dos items
            if getPlayerItemCount(cid, itemid[i].item) >= itemid[i].count then                                    -- caso o player tenha o item
                save_items = save_items + 1                                                    -- salva na variavel
            end
        end
        if save_items >= #itemid then                                                        -- se tiver todos os items necessários
            selfSay("Otimo! vai levar 9 horas ate que a espada fique pronta, volte aqui em "..getTimeString(tempo_de_espera*60)..".", cid)        -- manda a mensagem
            setPlayerStorageValue(cid, storage, os.time() + (tempo_de_espera*60))                                            -- seta a storage pra 60 minutos
            for i=1, #itemid do
                doPlayerRemoveItem(cid, itemid[i].item, itemid[i].count)                                                                        -- remove os items do player
            end
        else
            selfSay("Desculpe, mas o senhor nao me trouxe os itens necessarios!", cid)                                    -- mensagem caso não tenha os items necessários
            talkState[talkUser] = 0
            npcHandler:releaseFocus(cid)
        end
    elseif isInArray({"no","não","nao","not"}, msg) and talkState[talkUser] == 2 then                        -- caso o player não queira trocar, só da tchau
         selfSay("Tudo bem então, Bye!", cid)
         talkState[talkUser] = 0
         npcHandler:releaseFocus(cid)
    elseif isInArray({"receber","receber item"}, msg) then                                                            -- caso o player digite "receber"
        if (getPlayerStorageValue(cid, storage) - os.time() <= 0 and getPlayerStorageValue(cid, storage) ~= 0 and getPlayerStorageValue(cid, storage) ~= -1) then -- checa se já passou [tempo de espera], e não é 0
              local new_item = doCreateItemEx(item_trocado, 1)
            local receive = doPlayerAddItemEx(cid, new_item)
            if receive == RETURNVALUE_NOERROR then                                -- caso o player tenha slot na bp, etc..
                selfSay("Sua espada esta pronta, aqui esta!", cid)                                            -- msg do NPC
                setPlayerStorageValue(cid, storage, 0)                                                                -- seta a storage do player pra 0
                talkState[talkUser] = 0
                npcHandler:releaseFocus(cid)
            else
                selfSay("Sua espada esta pronta, deixe espaço em sua mochila!", cid)                                        -- caso não consiga entregar o item só pede pra deixar espaço    
                talkState[talkUser] = 0
                npcHandler:releaseFocus(cid)
            end
        elseif getPlayerStorageValue(cid, storage) - os.time() > 0 then
            selfSay("Sua espada ainda {nao esta pronta}, volte em "..getTimeString((getPlayerStorageValue(cid, storage)-os.time()))..".", cid)    -- caso ainda não esteja pronto o item
            talkState[talkUser] = 0
            npcHandler:releaseFocus(cid)
        elseif getPlayerStorageValue(cid, storage) == 0 then
            selfSay("Desculpe, mas o senhor nao me trouxe os itens necessarios!", cid)    -- caso ainda não esteja pronto o item
            talkState[talkUser] = 0
            npcHandler:releaseFocus(cid)
        end
    end
 
   return true
end
 
 
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

@Strikerzerah

trocar a fala de 10kk por
selfSay("Voce aceita me pagar {"..lista.."} pela espada?", cid)

coloca o script acima, e reabre o ot ou recria o NPC, sempre que editar script de NPC´, é necessário recria-lo

Link para o post
Compartilhar em outros sites

essa função da lista teria como remover? pq dai falaria isso 23:01 Kavek: Otimo, me traga o que te pedi: 30 pieces of iron, 30 silver broochs, 10 golden mugs, 1 demonic essence e 10kk.

 agora funcionou... ta tudo certinho!!!

Editado por Strikerzerh (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Moderador
 elseif isInArray({"espada","troca","trocar"}, msg) then                                -- mensagem do player
        if getPlayerStorageValue(cid, storageAceitar) == 1 then
            local lista = ''
            for i=1, #itemid do
                lista = lista..itemid[i].count..' - '..getItemNameById(itemid[i].item)
                if i+1 <= #itemid then
                    lista = lista..', '
                end
            end
           -- selfSay("Voce aceita me pagar {"..lista.."} pela espada?", cid)                -- msg do NPC
 			selfSay("Voce aceita me pagar 10KK pela espada?", cid)                -- msg do NPC
  			talkState[talkUser] = 2
  

 

só trocar aquela parte por essa.

mas tipo, o player vai falar espada e ele vai querer só 10kk, ai depois vai pedir outros items?

 

 

lembrando, depois que alterar RECRIE o NPC

Link para o post
Compartilhar em outros sites

não o 10kk eu botei aleatorio sao akeles itens dps vou alterar tudo certinho 23:09 Kavek: Onde voce encontrou esta espada quebrada? com ela posso fazer uma poderosa espada, mais vc vai precisar trazer 30 pieces of iron, 30 silver broochs, 10 golden mugs, 1 demonic essence e 10kk. Aceita?

Editado por Strikerzerh (veja o histórico de edições)
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