@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: