Ir para conteúdo
  • Cadastre-se

(Resolvido)pedido script held fusion


Ir para solução Resolvido por marcot,

Posts Recomendados

queria um script que funcionasse assim (formulei assim na minha cabeça), existem helds no meu servidor (separados de tier 1 ao tier 7), queria o script de uma maquina que quando eu colocasse três helds do mesmo tier se transformasse em um do tier acima (exemplo: 3 helds tier 4 se fundiriam em um tier 5 aleatório)

alguém pode me ajudar? acredito que não seja tão dificil

Link para o post
Compartilhar em outros sites
9 minutos atrás, marcot disse:

Estou tentando fazer. Mais tarde edito com o resultado.

Todos helds devem possuir a mesma chance de drop ou não?

 

eu preferia que fosse configuravel essa chance mas, se for mto dificil, não precisa

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

@Danxi

Eu testei um pouco o sistema e a princípio parece que funcionou. Gostaria que você testasse adequadamente e, caso encontre algum bug, me mande aqui nessa mesma página que vou tentar corrigir.

 

Nome:

Fusão de Held Item

Testado em:

The Forgotten Server 0.4

Como instalar:

1) Cole a tag em data/actions/actions.xml
2) Crie um arquivo chamado "heldFusion.lua" em data/actions/scripts e cole o "script" dentro dele
3) Vá no map editor de sua preferência, crie um contêiner e um ativador (nos testes usei uma alavanca), guarde a posição do contêiner, pois será necessário na configuração do script.
4) Ainda no map editor, coloque o actionID 10001 no ativador
Pronto!

Tag:

	<action actionid = "10001" event = "script" value = "heldFusion.lua" />

Script:

-- 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 = 10001, -- Qual o storageID dessa quest? (caso true, anteriormente)
	},
	chestPos = {x = 92, y = 114, z = 7, 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
	helds = { -- Item IDs e chance de vir o held
		[1] = { -- Array Tier 1
			{ID = 2159, chance = 10},
			{ID = 2160, chance = 80},
			{ID = 2158, chance = 10},
		},
		[2] = { -- Array Tier 2
			{ID = 2000, chance = 20},
			{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)

	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[i] do
				if config.helds[i][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[i].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%C3%B3rio-mas-com-diferentes-probabilidades
function sorteiaValor (tierSorteado, numeroSorte)
	x = numeroSorte
	for i = 1, #config.helds[tierSorteado] do
		x = x - config.helds[tierSorteado][i].chance
		if x <= 0 then
			return config.helds[tierSorteado][i].ID
		end
	end
end

 

 

Caso queira personalizar as mensagens eu deixei comentários encima de cada mensagem explicando quando são executadas, desculpe pelo meu inglês fisk, só consigo ler, quando vou escrever é um desastre. 

 

P.S.: Note que o script só olha os 3 primeiros itens de dentro do contêiner, portanto, cabe ao utilizador do script limitar o slot desse contêiner para 3.

 

[EDIT] Link para compreender a configuração do stackpos: 

 

Editado por marcot (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
36 minutos atrás, marcot disse:

@Danxi

Eu testei um pouco o sistema e a princípio parece que funcionou. Gostaria que você testasse adequadamente e, caso encontre algum bug, me mande aqui nessa mesma página que vou tentar corrigir.

 

Nome:


Fusão de Held Item

Testado em:


The Forgotten Server 0.4

Como instalar:


1) Cole a tag em data/actions/actions.xml
2) Crie um arquivo chamado "heldFusion.lua" em data/actions/scripts e cole o "script" dentro dele
3) Vá no map editor de sua preferência, crie um contêiner e um ativador (nos testes usei uma alavanca), guarde a posição do contêiner, pois será necessário na configuração do script.
4) Ainda no map editor, coloque o actionID 10001 no ativador
Pronto!

Tag:


	<action actionid = "10001" event = "script" value = "heldFusion.lua" />

Script:


-- 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 = 10001, -- Qual o storageID dessa quest? (caso true, anteriormente)
	},
	chestPos = {x = 92, y = 114, z = 7, stackpos = 255}, -- 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
	helds = { -- Item IDs e chance de vir o held
		[1] = { -- Array Tier 1
			{ID = 2159, chance = 10},
			{ID = 2160, chance = 80},
			{ID = 2158, chance = 10},
		},
		[2] = { -- Array Tier 2
			{ID = 2000, chance = 20},
			{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)

	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[i] do
				if config.helds[i][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.")
	end

	-- Sortear qual held vira
	for i = 1, 3 do
		doRemoveItem(items[i].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%C3%B3rio-mas-com-diferentes-probabilidades
function sorteiaValor (tierSorteado, numeroSorte)
	x = numeroSorte
	for i = 1, #config.helds[tierSorteado] do
		x = x - config.helds[tierSorteado][i].chance
		if x <= 0 then
			return config.helds[tierSorteado][i].ID
		end
	end
end

 

 

Caso queira personalizar as mensagens eu deixei comentários encima de cada mensagem explicando quando são executadas, desculpe pelo meu inglês fisk, só consigo ler, quando vou escrever é um desastre. 

 

P.S.: Note que o script só olha os 3 primeiros itens de dentro do contêiner, portanto, cabe ao utilizador do script limitar o slot desse contêiner para 3.

 

 

	if heldType[1] ~= heldType[2] or heldType[2] ~= heldType[3] then

 

aqui ele já tá configurado para os 7 tier?

Link para o post
Compartilhar em outros sites
57 minutos atrás, marcot disse:

Esse if é responsável apenas por ver se os 3 helds dentro da máquina são do mesmo tier, independente se for de 1 a 7

image.png.3ca0d19dd6d49c0677be8bc735c41704.png

 

image.thumb.png.20a00178e878175c791796e6b969fc26.png

 

image.thumb.png.18708035f1820e42a638fa8408b5267c.png

 

e da o seguinte erro no tfs:

 

[22/02/2018 19:56:48] [Error - Action Interface]
[22/02/2018 19:56:48] data/actions/scripts/heldFusion.lua:onUse
[22/02/2018 19:56:48] Description:
[22/02/2018 19:56:48] (luaGetContainerItem) Container not found

 

(como vc ve no print não tem nada em cima do container, está especificada a posição correta)

 

no items.xml o container tá assim:

 

	<item id="16178" article="a" name="held slot machine" >
			<attribute key="containerSize" value="3" />
				</item>

 

eu acredito que foi tudo configurado corretamente :p

Link para o post
Compartilhar em outros sites

Você poderia adicionar isto

 doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Item selecionado: " .. container.itemid)

depois da linha

container = getThingFromPos(config.chestPos)

e mandar o que apareceu?

 

 

Link para o post
Compartilhar em outros sites

Poderia dizer os ids de todos os itens nesse SQM, incluindo o piso, na ordem em que estão?

 

Acredito que o erro esteja na configuração do stackpos

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

Não faz sentido, o stackpos 255 corresponde ao item mais acima do stack de um SQM, se ele imprime o chão então teoricamente não tem nada acima dele.

 

Troque o stackpos para 1 e certifique-se se a posição está realmente correta (a mesma posiçao que você deu look e apareceu que possui 3 slots)

Link para o post
Compartilhar em outros sites

@marcot funcionou esse stackpos = 1,  obrigado!

 

-- edit

 

tem um erro, se eu colocar helds de tiers diferentes eles fundem também ;/

coloquei dois held 6 e um 5 e mesmo assim virou um tier 7

isso aqui não tá funcionando corretamente:

 

	if heldType[1] ~= heldType[2] or heldType[2] ~= heldType[3] then

 

tentei mudar o or pra and, tentei colocar assim:

 

	if heldType[1] ~= heldType[2] or heldType[2] ~= heldType[3] or heldType[1] ~= heldType[3]  then

e também não funcionou

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

Vou dar uma olhada e já edito.

[EDIT]

@Danxi aparentemente eu esqueci de encerrar o script quando dava o erro, tanto que são exibidas as duas mensagens:

22:30 You need helds with the same tier.
22:30 You received your new held item.

Para consertar basta colocar esta linha:

return false

Depois da mensagem de erro:

doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need helds with the same tier.")

 

Irei atualizar no tópico inicial, desculpe pelo transtorno.

Editado por marcot (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • 1 month later...

@marcot, então amigo, será que você poderia colocar duas coisas a mais no seu script?
A 1ª é: Para cada tier a pessoa ter uma quantia necessária de dinheiro, tipo assim.
Fusão de Tier 1 para Tier 2: 3 helds tier 1 + 60K
Fusão de Tier 2 para Tier 3: 3 helds tier 2 + 150K

Fusão de Tier 3 para Tier 4: 3 helds tier 3 + 300K

Fusão de Tier 4 para Tier 5: 3 helds tier 4 + 700K

Fusão de Tier 5 para Tier 6: 3 helds tier 5 + 1KK

Fusão de Tier 6 para Tier 7: 3 helds tier 6 + 1.5KK
Fusão de Tier 7 para Tier 7: 3 helds tier 7 + 1.8KK

 

A 2ª é: Poder colocar a fusão de helds tier 7 por tier 7 pois não tá dando para fundir tier 7

"You cannot fuse tier 7 held items."
Editado por Arthasz Walker (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
21 minutos atrás, Arthasz Walker disse:

@marcot, então amigo, será que você poderia colocar para cada tier a pessoa ter uma quantia necessária de dinheiro, tipo assim.
Fusão de Tier 1 para Tier 2: 3 helds tier 1 + 60K
Fusão de Tier 2 para Tier 3: 3 helds tier 2+ 150K

Fusão de Tier 3 para Tier 4: 3 helds tier 3+ 300K

Fusão de Tier 4 para Tier 5: 3 helds tier 4+ 700K

Fusão de Tier 5 para Tier 6: 3 helds tier 5+ 1KK

Fusão de Tier 6 para Tier 7: 3helds tier 6+ 1.5KK

Não estou com nenhum servidor no PC pelo momento para testar, mas tente esse:

-- 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 = 10001, -- Qual o storageID dessa quest? (caso true, anteriormente)
    },
    chestPos = {x = 92, y = 114, z = 7, 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 = 2159, chance = 10},
            {ID = 2160, chance = 80},
            {ID = 2158, chance = 10},
        },
        [2] = { -- Array Tier 2
            {ID = 2000, chance = 20},
            {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)

    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[i] do
                if config.helds[i][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

    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

    -- Sortear qual held vira
    for i = 1, 3 do
        doRemoveItem(items[i].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%C3%B3rio-mas-com-diferentes-probabilidades
function sorteiaValor (tierSorteado, numeroSorte)
    x = numeroSorte
    for i = 1, #config.helds[tierSorteado] do
        x = x - config.helds[tierSorteado][i].chance
        if x <= 0 then
            return config.helds[tierSorteado][i].ID
        end
    end
end

Os preços são configurados no próprio config, a modificação que fiz foi adicionar a variável de configurar e essas 3 linhas:

    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

Se não der certo pode me marcar aqui com o erro que apresentar

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

@Arthasz Walker,

Desculpa, fiz um erro besta, nem lembrei que prices era um array kkk. Acho que dessa vez vai, desculpa mesmo não estar podendo testar no momento estou sem meu desktop com os arquivos de otserver

Tenta essa versão:

-- 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 = 10001, -- Qual o storageID dessa quest? (caso true, anteriormente)
    },
    chestPos = {x = 92, y = 114, z = 7, 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 = 2159, chance = 10},
            {ID = 2160, chance = 80},
            {ID = 2158, chance = 10},
        },
        [2] = { -- Array Tier 2
            {ID = 2000, chance = 20},
            {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)

    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[i] do
                if config.helds[i][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

    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

    -- Sortear qual held vira
    for i = 1, 3 do
        doRemoveItem(items[i].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%C3%B3rio-mas-com-diferentes-probabilidades
function sorteiaValor (tierSorteado, numeroSorte)
    x = numeroSorte
    for i = 1, #config.helds[tierSorteado] do
        x = x - config.helds[tierSorteado][i].chance
        if x <= 0 then
            return config.helds[tierSorteado][i].ID
        end
    end
end

 

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

@marcot
Funcionou perfeitamente mano, muito obrigado, posso te marcar em um tópico de ajuda pra ver se você consegue resolver o meu problema irmão?

Mas acho que você esqueceu de outra coisa.

    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

Você colocou o array no primeiro e não colocou no segundo:

Citar

config.prices["tier_..heldType[1]]


fora isso o script tá ótimo, rep+.

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.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo