Postado Dezembro 31, 2017 7 anos -- UPDATE, SOLUÇÃO ABAIXO! -- Olá, estou utilizando o sistema do Killua de refinamento de armas no meu servidor TFS 0.4.0 (este: http://www.tibiaking.com/forum/forums/topic/34708-sistema-de-upgrade-bronson-server-refinar/? ) que possui o seguinte código: --- Sistema de Upgrade de itens feito por Killua. --- Sistema feito com base no do Bronson Server. local vocations = {1, 2, 4, 5, 6, 7, 8} -- Vocações que podem refinar itens local ids_bloqueados = {2160, 5706, 2463} -- Itens que não podem ser refinados local controle = { {level = 0, quantOre = 1, chance = 100}, -- Level do item, quantidade de Iron Ore necessaria, chance de sucesso {level = 1, quantOre = 2, chance = 90}, {level = 2, quantOre = 3, chance = 80}, {level = 3, quantOre = 4, chance = 70}, {level = 4, quantOre = 5, chance = 60}, {level = 5, quantOre = 6, chance = 50}, {level = 6, quantOre = 7, chance = 40}, {level = 7, quantOre = 8, chance = 30}, {level = 8, quantOre = 9, chance = 20}, {level = 9, quantOre = 10, chance = 10} } function getItemLevel(uid) if uid > 0 then return getItemAttribute(uid, "lvl") or 0 end return false end function doItemAddLevel(uid, count) if uid > 0 and tonumber(count) > 0 then return doItemSetAttribute(uid, "lvl", getItemLevel(uid) + count) end return false end function onUse(cid, item, fromPosition, itemEx, toPosition) if not isInArray(vocations, getPlayerVocation(cid)) then return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.") elseif isInArray(ids_bloqueados, itemEx.uid) then return doPlayerSendCancel(cid, "Este item nao pode ser refinado.") end if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then for _, upgrade in pairs(controle) do local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor local chance = math.random(1, 100) if getItemLevel(itemEx.uid) == upgrade.level then if doPlayerRemoveItem(cid, 5880, upgrade.quantOre) then doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_CRAPS) if chance <= upgrade.chance then if getItemLevel(itemEx.uid) == 0 then doItemSetAttribute(itemEx.uid, "description", "Esse item foi refinado por" ..getCreatureName(cid)) end doItemAddLevel(itemEx.uid, 1) doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid)) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce refinou com sucesso! Agora seu "..getItemNameById(itemEx.itemid).." eh level " ..getItemLevel(itemEx.uid)) if getItemInfo(itemEx.itemid).attack > 0 then doItemSetAttribute(itemEx.uid, "attack", atk + 1) return true elseif getItemInfo(itemEx.itemid).armor > 0 then doItemSetAttribute(itemEx.uid, "armor", arm + 1) return true elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then doItemSetAttribute(itemEx.uid, "defense", def + 1) return true end else doTransformItem(itemEx.uid, 2256) doItemSetAttribute(itemEx.uid, 'name', "metal trash") doItemSetAttribute(itemEx.uid, 'attack', 0) doItemSetAttribute(itemEx.uid, 'armor', 0) doItemSetAttribute(itemEx.uid, 'defense', 0) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce falhou.") return true end else doPlayerSendCancel(cid, "Voce nao tem iron ores o suficiente. Voce precisa de "..upgrade.quantOre.." iron ores.") end end end else doPlayerSendCancel(cid, "Esse item nao pode ser refinado.") end return true end O sistema funciona perfeitamente, mas funciona em qualquer lugar do mapa. Gostaria de adicionar uma condição para que a reforja dos itens só fosse possível quando o item a ser refinado estiver em cima de uma bigorna (anvil), que no caso tem id 2555. Eu tentei eu mesmo inserir o seguinte código: {...} function onUse(cid, item, fromPosition, itemEx, toPosition) if not isInArray(vocations, getPlayerVocation(cid)) then return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.") elseif isInArray(ids_bloqueados, itemEx.uid) then return doPlayerSendCancel(cid, "Este item nao pode ser refinado.") end local posicao = {x=toPosition.x, y=toPosition.y, z=toPosition.z, stackpos=2} local base = getThingFromPos(posicao) if base.id == 2555 then if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then for _, upgrade in pairs(controle) do local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor {...} else doPlayerSendCancel(cid, "You must find an appropriate place to reforge your item.") end return true end Eu não sou programador nem nada, mas pelo que entendo, a minha lógica foi: local posicao = {x=toPosition.x, y=toPosition.y, z=toPosition.z, stackpos=2} <--- Pegar a posição em que o player usou o martelo da forja, sendo o stackpos=2 a posição relativa da bigorna naquele sqm.local base = getThingFromPos(posicao) <--- Identificar o que há naquela posição Depois em: if base.id == 2555 then <--- verificar se o ID do item é o 2555 (bigorna) para executar todo o código da forja E ao final, o else: else doPlayerSendCancel(cid, "You must find an appropriate place to reforge your item.") <--- caso não seja uma bigorna, nada ocorre e há uma mensagem confirmando isso. end Em suma: este meu código não está funcionando. Não há erros na distro, e sempre que tento reforjar o item recebo este mensagem contida no "else", indicando que não estou achando o id da bigorna (2555) na minha verificação de posição. O que fiz de errado?Alguém pode me ajudar? Desde já, grato! Editado Dezembro 31, 2017 7 anos por Tadelho Arrumar o link do Killua System (veja o histórico de edições)
Postado Dezembro 31, 2017 7 anos Creio qur o erro está na escrita na parte do if, o corretor seria: If base.uid == 2555 then Você colocou base.id, o correto seria base.uid
Postado Dezembro 31, 2017 7 anos Autor @Luis360 Tentei a substituição, mas infelizmente não é isso. --- UPDATE, SOLUCIONADO! --- Pessoal, consegui corrigir. Coloquei da seguinte forma: base = getThingFromPos({x=toPosition.x, y=toPosition.y, z=toPosition.z, stackpos=2}) if base.itemid == 2555 then Resumindo: retirei o "local posicao" (não era necessário) e coloquei .itemid ao invés de .id ou .uid. Está funcionando, mas caso alguém utilize esse código no futuro tome muito cuidado com o "stackpos", este código não funcionará caso o item que você deseja utilizar como referência esteja em empilhado em outra posição. Procure por como funciona o stackpos (tem aqui no fórum bem explicado: http://www.tibiaking.com/forum/forums/topic/19261-entendendo-o-stackpos/ ) para maiores detalhes. Obrigado, abraços! Editado Dezembro 31, 2017 7 anos por Tadelho (veja o histórico de edições)
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.