MI

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

Por mister17, 15 de jan. de 2020 em Scripts

7
1.1k
mister17M
15 de janeiro de 2020 às 12:35

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 Janeiro 15 por mister17

BlazerXB
15 de janeiro de 2020 às 14:40

 

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 Janeiro 15 por BlazerX

mister17M
15 de janeiro de 2020 às 14:54
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 Janeiro 15 por mister17

BlazerXB
15 de janeiro de 2020 às 17:33
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

 

 

mister17M
15 de janeiro de 2020 às 17:40
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 ]?

 

 

 

BlazerXB
15 de janeiro de 2020 às 17:45
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.

mister17M
15 de janeiro de 2020 às 17:48
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