Ir para conteúdo
  • 0

Script dando erro ao executar sistema de fusão de held


mister17

Pergunta

Ola todos tudo bem?

 

Estou implementando alguns sistemas em um server e ao colocar sistema de fusão tive este erro, alguém por gentileza pode me ajudar?

Desde ja sou grato por tudo

 Erro distro

Spoiler

image.png.bcdb0568dcdf460250ca33ddb5679f76.png

 

Editado por mister17
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 1
2 horas atrás, mister17 disse:

entendi, eu tenho 1 do mesmo perfil que esta rodando 100%

tentei adicionar a parte do valores mas mesmo assim qual eu insiro o paragrafo da cobrança do dinheiro ai ele me reporta este erro

Abaixo é o codigo que tenho para apena a fusão esta funcionando 100% sem cobrar o valor necessario

  Ocultar conteúdo

-- Held Fusion 0.1 by Marcot
-- Se encontrou algum erro no script, favor enviar PM explicando os erros
-- http://www.tibiaking.com/forum/profile/120572-marcot/

-- Configuracoes necessarias para o script
local config = {
    quest = { -- Precisa fazer quest? (Nao mexa caso negativo)
        necessaria = false, -- Eh necessario fazer uma quest para liberar o sistema?
        storageID = 10006, -- Qual o storageID dessa quest? (caso true, anteriormente)
    },
    chestPos = {x = 1017, y = 1072, z = 13, stackpos = 1},-- Posicao do Bau (certifique-se que nao tenha nada encima dele)
            --{x = 1005, y = 1072, z = 13, stackpos = 1},-- Posicao do Bau (certifique-se que nao tenha nada encima dele)
    
    -- Tenha atencao para que a soma das chances dos helds em cada tier seja igual a 100
    prices = {
        ["tier_1"] = 60000,
        ["tier_2"] = 150000,
        ["tier_3"] = 300000,
        ["tier_4"] = 700000,
        ["tier_5"] = 1000000,
        ["tier_6"] = 1500000,
    },
    
    
    helds = { -- Item IDs e chance de vir o held
        [1] = { -- Array Tier 1
            {ID = 13720, chance = 100},
            --{ID = 2160, chance = 80},
            --{ID = 2158, chance = 10},
        },
        [2] = { -- Array Tier 2
            {ID = 13818, chance = 100},
            --{ID = 2001, chance = 20},
            --{ID = 2002, chance = 20},
            --{ID = 2003, chance = 20},
            --{ID = 2004, chance = 20},
        },
        [3] = { -- Array Tier 3

        },
        [4] = { -- Array Tier 4

        },
        [5] = { -- Array Tier 5

        },
        [6] = { -- Array Tier 6

        },
        [7] = { -- Array Tier 7

        },
    },
}

function onUse(cid, item, fromPosition, itemEx, toPosition)
    if config.quest.necessaria and getPlayerStorageValue (cid, config.quest.storageID) == 0 then
        -- Erro caso a pessoa use a maquina sem ter feito a quest
        -- Valido apenas quando a opcao esta ativada
        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don\'t have permission to use this machine.")
        return false
    end

    items = {nil, nil, nil}
    container = getThingFromPos(config.chestPos)
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Item selecionado: " .. container.itemid)

    for i = 0, 2 do
        items[i + 1] = getContainerItem (container.uid, i)
        if items [i + 1].itemid == 0 or items [i + 1].itemid == nil then
            -- Erro quando tem menos de 3 itens no bau
            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need 3 held items to fuse.")
            return false
        end
    end

    heldType = {nil, nil, nil}

    for j=1, 3 do
        for i=1, 7 do
            for k = 1, #config.helds do
                if config.helds[k].ID == items[j].itemid then
                    heldType[j] = i
                end
            end
        end
        if heldType [j] == nil then
            -- Erro a ser exibido caso o jogador coloque algum item que nao seja um held na maquina
            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "This machine works only to held items.")
            return false
        end

    end

    if heldType[1] ~= heldType[2] or heldType[2] ~= heldType[3] then
        -- Erro a ser exibido caso o jogador coloque helds de tiers diferentes
        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need helds with the same tier.")
        return false
    elseif heldType[1] == 7 or heldType[2] == 7 or heldType[3] == 7 then
        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You cannot fuse tier 7 held items.")
        return false
    end
    

    -- Sortear qual held vira
    for i = 1, 3 do
        doRemoveItem(items.uid, 1)
    end

    tierSorteado = heldType[1] + 1
    numeroSorte = math.random(1, 100)

    itemIDSorteado = sorteiaValor (tierSorteado, numeroSorte)

    doPlayerAddItem(cid, itemIDSorteado, 1)

    -- Mensagem exibida ao fundir com sucesso
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You received your new held item.")
    return true
end

-- Função retirada de https://pt.stackoverflow.com/questions/147884/sorteio-aleatório-mas-com-diferentes-probabilidades
function sorteiaValor (tierSorteado, numeroSorte)
    x = numeroSorte
    for i = 1, #config.helds[tierSorteado] do
        x = x - config.helds[tierSorteado].chance
        if x <= 0 then
            return config.helds[tierSorteado].ID
        end
    end
end

 

O problema é quando eu insiro as linhas abaixo

  Ocultar conteúdo


if not doPlayerRemoveMoney(cid, config.prices.tier_..heldType[1]) then -- Se nao for possivel retirar a quantia de dinheiro do jogador, finalizar script
		doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need " .. config.prices.tier_..heldType[1] .. " gold to fuse tier ".. heldType[1].. " held items.")
        return false
    end

  detalhe que se voce ver é o mesmo script porem ao inserir a parte de cobrar o valor que da erro

 

Veja se resolve:

if not doPlayerRemoveMoney(cid, config.prices["tier_"..heldType[1]]) then -- Se nao for possivel retirar a quantia de dinheiro do jogador, finalizar script
	doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need " .. config.prices["tier_"..heldType[1]] .. " gold to fuse tier ".. heldType[1].. " held items.")
	return false
end

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

 

Veja bem o que você fez, lembre-se não basta copiar e colar código sem entender, você está tentando concatenar um valor que seja nulo ou seja esse seu heldType[1] não está retornando o valor desejado para que a concatenação seja bem sucedida.

 

 

Editado por BlazerX
Link para o comentário
Compartilhar em outros sites

  • 0
16 minutos atrás, BlazerX disse:

 

Veja bem o que você fez, lembre-se não basta copiar e colar código sem entender, você está tentando concatenar um valor que seja nulo ou seja esse seu heldType[1] não está retornando o valor desejado para que a concatenação seja bem sucedida.

 

 

entendi, eu tenho 1 do mesmo perfil que esta rodando 100%

tentei adicionar a parte do valores mas mesmo assim qual eu insiro o paragrafo da cobrança do dinheiro ai ele me reporta este erro

Abaixo é o codigo que tenho para apena a fusão esta funcionando 100% sem cobrar o valor necessario

Spoiler

-- Held Fusion 0.1 by Marcot
-- Se encontrou algum erro no script, favor enviar PM explicando os erros
-- http://www.tibiaking.com/forum/profile/120572-marcot/

-- Configuracoes necessarias para o script
local config = {
    quest = { -- Precisa fazer quest? (Nao mexa caso negativo)
        necessaria = false, -- Eh necessario fazer uma quest para liberar o sistema?
        storageID = 10006, -- Qual o storageID dessa quest? (caso true, anteriormente)
    },
    chestPos = {x = 1017, y = 1072, z = 13, stackpos = 1},-- Posicao do Bau (certifique-se que nao tenha nada encima dele)
            --{x = 1005, y = 1072, z = 13, stackpos = 1},-- Posicao do Bau (certifique-se que nao tenha nada encima dele)
    
    -- Tenha atencao para que a soma das chances dos helds em cada tier seja igual a 100
    prices = {
        ["tier_1"] = 60000,
        ["tier_2"] = 150000,
        ["tier_3"] = 300000,
        ["tier_4"] = 700000,
        ["tier_5"] = 1000000,
        ["tier_6"] = 1500000,
    },
    
    
    helds = { -- Item IDs e chance de vir o held
        [1] = { -- Array Tier 1
            {ID = 13720, chance = 100},
            --{ID = 2160, chance = 80},
            --{ID = 2158, chance = 10},
        },
        [2] = { -- Array Tier 2
            {ID = 13818, chance = 100},
            --{ID = 2001, chance = 20},
            --{ID = 2002, chance = 20},
            --{ID = 2003, chance = 20},
            --{ID = 2004, chance = 20},
        },
        [3] = { -- Array Tier 3

        },
        [4] = { -- Array Tier 4

        },
        [5] = { -- Array Tier 5

        },
        [6] = { -- Array Tier 6

        },
        [7] = { -- Array Tier 7

        },
    },
}

function onUse(cid, item, fromPosition, itemEx, toPosition)
    if config.quest.necessaria and getPlayerStorageValue (cid, config.quest.storageID) == 0 then
        -- Erro caso a pessoa use a maquina sem ter feito a quest
        -- Valido apenas quando a opcao esta ativada
        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don\'t have permission to use this machine.")
        return false
    end

    items = {nil, nil, nil}
    container = getThingFromPos(config.chestPos)
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Item selecionado: " .. container.itemid)

    for i = 0, 2 do
        items[i + 1] = getContainerItem (container.uid, i)
        if items [i + 1].itemid == 0 or items [i + 1].itemid == nil then
            -- Erro quando tem menos de 3 itens no bau
            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need 3 held items to fuse.")
            return false
        end
    end

    heldType = {nil, nil, nil}

    for j=1, 3 do
        for i=1, 7 do
            for k = 1, #config.helds do
                if config.helds[k].ID == items[j].itemid then
                    heldType[j] = i
                end
            end
        end
        if heldType [j] == nil then
            -- Erro a ser exibido caso o jogador coloque algum item que nao seja um held na maquina
            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "This machine works only to held items.")
            return false
        end

    end

    if heldType[1] ~= heldType[2] or heldType[2] ~= heldType[3] then
        -- Erro a ser exibido caso o jogador coloque helds de tiers diferentes
        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need helds with the same tier.")
        return false
    elseif heldType[1] == 7 or heldType[2] == 7 or heldType[3] == 7 then
        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You cannot fuse tier 7 held items.")
        return false
    end
    

    -- Sortear qual held vira
    for i = 1, 3 do
        doRemoveItem(items.uid, 1)
    end

    tierSorteado = heldType[1] + 1
    numeroSorte = math.random(1, 100)

    itemIDSorteado = sorteiaValor (tierSorteado, numeroSorte)

    doPlayerAddItem(cid, itemIDSorteado, 1)

    -- Mensagem exibida ao fundir com sucesso
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You received your new held item.")
    return true
end

-- Função retirada de https://pt.stackoverflow.com/questions/147884/sorteio-aleatório-mas-com-diferentes-probabilidades
function sorteiaValor (tierSorteado, numeroSorte)
    x = numeroSorte
    for i = 1, #config.helds[tierSorteado] do
        x = x - config.helds[tierSorteado].chance
        if x <= 0 then
            return config.helds[tierSorteado].ID
        end
    end
end

 

O problema é quando eu insiro as linhas abaixo

Spoiler

if not doPlayerRemoveMoney(cid, config.prices.tier_..heldType[1]) then -- Se nao for possivel retirar a quantia de dinheiro do jogador, finalizar script
		doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need " .. config.prices.tier_..heldType[1] .. " gold to fuse tier ".. heldType[1].. " held items.")
        return false
    end

  detalhe que se voce ver é o mesmo script porem ao inserir a parte de cobrar o valor que da erro

Editado por mister17
Link para o comentário
Compartilhar em outros sites

  • 0
5 minutos atrás, BlazerX disse:

 

Veja se resolve:


if not doPlayerRemoveMoney(cid, config.prices["tier_"..heldType[1]]) then -- Se nao for possivel retirar a quantia de dinheiro do jogador, finalizar script
	doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need " .. config.prices["tier_"..heldType[1]] .. " gold to fuse tier ".. heldType[1].. " held items.")
	return false
end

Funcionou só me tira uma duvida  éra o ]?

 

 

 

Link para o comentário
Compartilhar em outros sites

  • 0
Agora, mister17 disse:

 

O problema era que você estava tentando acessar a tebela prices e seus indices eram tudo string,

porem você acessava de forma errada, veja essa imagem:

tsLojfb.png

Como você pode ver na linha 14 ao 19 os índices são tudo strings e você tentava acessar na linha 99 e 100 de uma forma totalmente diferente do esperado.

Link para o comentário
Compartilhar em outros sites

  • 0
2 minutos atrás, BlazerX disse:

O problema era que você estava tentando acessar a tebela prices e seus indices eram tudo string,

porem você acessava de forma errada, veja essa imagem:

tsLojfb.png

Como você pode ver na linha 14 ao 19 os índices são tudo strings e você tentava acessar na linha 99 e 100 de uma forma totalmente diferente do esperado.

Entendi muito obrigado

 

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...