Ir para conteúdo

Featured Replies

Postado

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

Resolvido por marcot

Ir para solução
  • Respostas 20
  • Visualizações 2.3k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • @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 corrig

  • 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-s

  • @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 arqu

Posted Images

Postado
  • Autor
  Em 22/02/2018 em 19:18, 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

Postado
  • 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)

Postado
  • Autor
  Em 22/02/2018 em 21:12, 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?

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

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo