Postado Fevereiro 6, 2015 10 anos só uma dica, podia incrementar pro player ter que pagar algum tributo cada vez que ele clica pra ver quais são os pares.. podia ser perder 10% da vida Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá! "Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda (obg ao @Beeny por fazer essa linda sign <3)
Postado Fevereiro 6, 2015 10 anos Autor só uma dica, podia incrementar pro player ter que pagar algum tributo cada vez que ele clica pra ver quais são os pares.. podia ser perder 10% da vida É uma boa sugestão! Essa é uma pequena puzzle que adicionei em uma espécie de Quest chamadas "Dangerous" que estou criando para meu futuro OTServ, onde envolve um tempo limite para ser realizada. A ideia é apenas prender o jogador por um tempo razoável, mas sem fazer ele parar totalmente - pois tem tempo. Por este motivo, fiz com que a utilização da Element Puzzle fosse liberada para qualquer um que esta dentro da DG sem a necessidade de pagar coisa alguma ou se preocupar com HP ou com potions. Apenas parar e analisar! - Se tiver em grupo, um amigo ativa as dicas dos elementos enquanto outro gira as estátuas. Ficando assim: Resolva a puzzle e passa pelo portal que te levará para a continuação da Quest. Se morrer lá na frente, retorna ao início e tem que passar pelo puzzle novamente. Mas em todo caso, gostei da sua ideia. Eu realmente estou estudando .lua para poder reformular esse Script - porque é óbvio que ele precisa de modificações. Quando eu souber o que fazer, adicionarei as devidas correções junto com sua sugestão. OBS: Sabe do que eu senti falta na sua avaliação #White? Dicas de estudo! Assim, logo após perceber algo que não devia no script, você poderia dizer: "Você errou aqui e minha sugestão é que estude isso e isso pra melhorar". Talvez postando link para algum tutorial ou algo do tipo. Eu não ficaria constrangido com você me mandando estudar, sério . Você entende melhor disso do que nós, meros mortais, e qualquer dica que vim de sua parte é uma grande contribuição. No mais... Obrigado! Editado Fevereiro 6, 2015 10 anos por Frenesy (veja o histórico de edições)
Postado Fevereiro 6, 2015 10 anos uhauheuhauh que isso cara, tem muita coisa que eu só sei na teoria.. o próprio script do kilua tá mais bonito e organizado que muito script meu :~ lembrem-se que eu sou estudante assim como vocês. Em todo caso você pode pensar numa forma de executar as funções por um for, já ia diminuir bastante linhas no seu código. Você tem que pensar tb que tudo no seu código é alterável e vc pode fazer alterações de forma a seguir sequência. ex: if item.itemid == 3705 then doTransformItem(item.uid, 3706) elseif item.itemid == 3706 then doTransformItem(item.uid, 3707) elseif item.itemid == 3707 then doTransformItem(item.uid, 3708) elseif item.itemid == 3708 then doTransformItem(item.uid, 3705) end note a lógica, todos são o numero atual +1 com exceção do 8, logo eu poderia simplificar simplesmente pra if item.itemid ~= 3708 then doTransformItem(item.uid, item.itemid + 1) else doTransformItem(item.uid, 3705) end fazendo um pouco mais de esforço eu poderia transformar num ternário local a = item.itemid ~= 3708 and doTransformItem(item.uid, item.itemid + 1) or doTransformItem(item.uid, 3705) Você ainda poderia fazer um if restritivo pro caso de ser maior e colocar o transform fora da checagem doTransformItem(item.uid, item.itemid + 1) if item.itemid > 3708 then doTransformItem(item.uid, 3705) end O segredo de programar é encontrar padrões matemáticos nos scripts.. claro que isso não vem da noite pro dia, vc precisa estudar bastante e ter uma visão bem ampla do mundo. O script que eu mais abusei de matemática foi esse daqui http://www.tibiaking.com/forum/topic/48627-fogos-de-artificio/ Só lembra que não tem jeito certo e errado, apenas formas diferentes. A nivel de tibia, uma forma que usa mais ou menos memória não vai atrapalhar, é mais pra ter um script bonito esteticamente e de fácil entendimento edit: vc tb pode remover de dentro do callback tudo que não depende de algum de seus parametros e identar da forma correta. Não testei pra ver se funciona mas acredito que assim diminua um pouco das linhas e deixe mais bonito de se ver: local posA = { {x = 997, y = 993, z = 7, stackpos= 1}, -- Fogo {x = 995, y = 994, z = 7, stackpos= 1}, -- Pedra {x = 994, y = 996, z = 7, stackpos= 1}, -- Dark {x = 994, y = 998, z = 7, stackpos= 1}, -- Terra {x = 995, y = 1000, z = 7, stackpos= 1}, -- Gelo {x = 997, y = 1001, z = 7, stackpos= 1}, -- Poison {x = 1001, y = 993, z = 7, stackpos= 1}, -- Gelo {x = 1003, y = 994, z = 7, stackpos= 1}, -- Poison {x = 1004, y = 996, z = 7, stackpos= 1}, -- Pedra {x = 1004, y = 998, z = 7, stackpos= 1}, -- Fogo {x = 1003, y = 1000, z = 7, stackpos= 1}, -- Dark {x = 1001, y = 1001, z = 7, stackpos= 1}, -- Terra } function onUse(cid, item, frompos, item2, topos) local posC = { -- Combinação das Estatuas. -- A Combinação é sempre formada por 2 index. [1 e 2]; [3 e 4]; [5 e 6], etc. -- Index do 1 ao 6 são as Estátuas do lado Esquerdo (As que não podem girar). Do 7 ao 12 são as do lado Direito (As que podem girar). -- A combinação deve ser sempre com números 1 ao 6 combinados com números 7 ao 12. [1] = getThingfromPos(posA[1]), -- Fogo [2] = getThingfromPos(posA[10]), -- Fogo [3] = getThingfromPos(posA[2]), -- Pedra [4] = getThingfromPos(posA[9]), -- Pedra [5] = getThingfromPos(posA[3]), -- Dark [6] = getThingfromPos(posA[11]), -- Dark [7] = getThingfromPos(posA[4]), -- Terra [8] = getThingfromPos(posA[12]), -- Terra [9] = getThingfromPos(posA[5]), -- Gelo [10] = getThingfromPos(posA[7]), -- Gelo [11] = getThingfromPos(posA[6]), -- Poison [12] = getThingfromPos(posA[8]), -- Poison -- Fogo [1 e 2]: Estatua que está na Posição 1 (Esquerdo), combina com a estátua que está na posição 10 (Direita). -- Pedra [3 e 4]: Estatua que está na Posição 2 (Esquerdo), combina com a estátua que está na posição 9 (Direita). -- Dark [5 e 6]: Estatua que está na Posição 3 (Esquerdo), combina com a estátua que está na posição 11 (Direita). -- ... } if getPlayerStorageValue(cid, 10000) == -1 then -- Combinação das Estátuas. Note que se você alterar a tabela "posC" acima, não precisa alterar nada essa parte do Script. Essa parte NUMCA deve ser alterada. if posC[1].itemid == posC[2].itemid and posC[3].itemid == posC[4].itemid and posC[5].itemid == posC[6].itemid and posC[7].itemid == posC[8].itemid and posC[9].itemid == posC[10].itemid and posC[11].itemid == posC[12].itemid then doSendMagicEffect(getPlayerPosition(cid), 14) setPlayerStorageValue(cid, 10000, 1) -- Se a combinação estiver certa, essa Storage impede que o jogador faça essa Quest novamente. setPlayerStorageValue(cid, 10001, 1) -- Ao chamar a próxima função, essa storage permite a animação da sestátuas. Sem ela, não tem animação. addEvent(CombCerta, 1000, cid, posA) -- Chama a próxima Função. -- Caso a sequência das estátuas esteja errada, mostrar as dicas dos elementos. -- Note que se você alterar a combinação na tabela "posC", você deve alterar os efeitos abaixo tambem. else doSendMagicEffect(getPlayerPosition(cid), 13) setPlayerStorageValue(cid, 10000, 1) -- Storage temporário. addEvent(doSendMagicEffect, 500, posA[11], 17) -- Dark [Efeito 17 na estátua de posição 11] addEvent(doSendMagicEffect, 500, posA[3], 17) -- Dark [Efeito 17 na estátua de posição 3] addEvent(doSendMagicEffect, 1500, posA[9], 44) -- Pedra [Efeito 44 na estátua de posição 9] addEvent(doSendMagicEffect, 1500, posA[2], 44) -- Pedra [Efeito 44 na estátua de posição 2] addEvent(doSendMagicEffect, 2500, posA[8], 46) -- Poison [Efeito 46 na estátua de posição 8] addEvent(doSendMagicEffect, 2500, posA[6], 46) -- Poison [Efeito 46 na estátua de posição 6] addEvent(doSendMagicEffect, 3500, posA[12], 50) -- Terra [Efeito 50 na estátua de posição 12] addEvent(doSendMagicEffect, 3500, posA[4], 50) -- Terra [Efeito 50 na estátua de posição 4] addEvent(doSendMagicEffect, 4500, posA[7], 43) -- Gelo [Efeito 43 na estátua de posição 7] addEvent(doSendMagicEffect, 4500, posA[5], 43) -- Gelo [Efeito 43 na estátua de posição 5] addEvent(doSendMagicEffect, 5500, posA[10], 6) -- Fogo [Efeito 6 na estátua de posição 10] addEvent(doSendMagicEffect, 5500, posA[1], 6) -- Fogo [Efeito 6 na estátua de posição 1] addEvent(doSendMagicEffect, 6500, getPlayerPosition(cid), 13) addEvent(setPlayerStorageValue, 6502, cid, 10000, -1) -- Se você mecher na Storage temporária acima, altere aqui tambem. end else doSendMagicEffect(getThingPos(cid), 2) end return true end function CombCerta(cid, posA) local posC = { [1] = getThingfromPos(posA[1]), -- Fogo [2] = getThingfromPos(posA[10]), -- Fogo [3] = getThingfromPos(posA[2]), -- Pedra [4] = getThingfromPos(posA[9]), -- Pedra [5] = getThingfromPos(posA[3]), -- Dark [6] = getThingfromPos(posA[11]), -- Dark [7] = getThingfromPos(posA[4]), -- Terra [8] = getThingfromPos(posA[12]), -- Terra [9] = getThingfromPos(posA[5]), -- Gelo [10] = getThingfromPos(posA[7]), -- Gelo [11] = getThingfromPos(posA[6]), -- Poison [12] = getThingfromPos(posA[8]), -- Poison } local tp = { toPos = {x = 998, y = 985, z = 7}, -- Posição da Sala da recompensa. Pos = {x = 999, y = 994, z = 7}, -- Posição onde será criado o Teleport. } -- Se a posição das estatuas estiverem de forma circular, assim como esta demonstrado na imagem e no video deste tópico, não precisa se importar em modificar aqui. if getPlayerStorageValue(cid, 10001) == 1 then doTransformItem(posC[1].uid, 3705) doSendMagicEffect(posA[1], 14) doTransformItem(posC[10].uid, 3705) doSendMagicEffect(posA[7], 14) addEvent(CombCerta, 1000, cid, posA) setPlayerStorageValue(cid, 10001, 2) elseif getPlayerStorageValue(cid, 10001) == 2 then doTransformItem(posC[3].uid, 3705) doSendMagicEffect(posA[2], 14) doTransformItem(posC[12].uid, 3705) doSendMagicEffect(posA[8], 14) addEvent(CombCerta, 1000, cid, posA) setPlayerStorageValue(cid, 10001, 3) elseif getPlayerStorageValue(cid, 10001) == 3 then doTransformItem(posC[5].uid, 3706) doSendMagicEffect(posA[3], 14) doTransformItem(posC[4].uid, 3708) doSendMagicEffect(posA[9], 14) addEvent(CombCerta, 1000, cid, posA) setPlayerStorageValue(cid, 10001, 4) elseif getPlayerStorageValue(cid, 10001) == 4 then doTransformItem(posC[7].uid, 3706) doSendMagicEffect(posA[4], 14) doTransformItem(posC[2].uid, 3708) doSendMagicEffect(posA[10], 14) addEvent(CombCerta, 1000, cid, posA) setPlayerStorageValue(cid, 10001, 5) elseif getPlayerStorageValue(cid, 10001) == 5 then doTransformItem(posC[9].uid, 3707) doSendMagicEffect(posA[5], 14) doTransformItem(posC[6].uid, 3707) doSendMagicEffect(posA[11], 14) addEvent(CombCerta, 1000, cid, posA) setPlayerStorageValue(cid, 10001, 6) elseif getPlayerStorageValue(cid, 10001) == 6 then doTransformItem(posC[11].uid, 3707) doSendMagicEffect(posA[6], 14) doTransformItem(posC[8].uid, 3707) doSendMagicEffect(posA[12], 14) addEvent(CombCerta, 1000, cid, posA) setPlayerStorageValue(cid, 10001, 7) elseif getPlayerStorageValue(cid, 10001) == 7 then for _, pos in ipairs(posA) do doSendDistanceShoot(pos, tp.Pos, 28) end doSendMagicEffect(tp.Pos, 10) doCreateTeleport(1387, tp.toPos, tp.Pos) doCreatureSay(cid, "O teleport irá sumir em 10 segundos.", TALKTYPE_ORANGE_1) addEvent(removetp, 10000, cid, posA) -- Aqui você muda o tempo que o Teleport ficará disponível. end end function removetp(cid, posB) local tp = {x = 999, y = 994, z = 7} -- Posição que o Teleport apareceu, para que ele seja removido. Deve ser o mesmo que o "Pos" da tabela "tp" acima. local t = getTileItemById(tp, 1387) for _, ale in ipairs(PosB) do local st = getThingfromPos(ale).uid doTransformItem(st, math.random(3705, 3708)) end if t then doRemoveItem(t.uid, 1) doSendMagicEffect(tp, CONST_ME_POFF) setPlayerStorageValue(cid, 10000, -1) -- Caso você não consiga entrar no teleport, poderá tentar novamente. end end Editado Abril 19, 2015 10 anos por xWhiteWolf (veja o histórico de edições) Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá! "Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda (obg ao @Beeny por fazer essa linda sign <3)
Postado Fevereiro 6, 2015 10 anos Autor Só pra constar, eu tentei adicionar a tabela com as posições das estátuas fora da function, no entanto, sempre que eu ligava o OT, travava e desligava tudo. Por isso deixei dentro da function e me senti obrigado a repetir dentro das outras function que ia fazendo O segredo de programar é encontrar padrões matemáticos nos scripts Gostei desse conselho. Aplicarei nos meus próximos scripts.
Postado Fevereiro 6, 2015 10 anos vc só coloca dentro se a tabela depender de alguma coisa do próprio script, do contrário ela será carregada quando o server abrir e vai permanecer fixa até o server fechar. Quando ela tá dentro do callback ela é carregada toda vez que o callback é executado Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá! "Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda (obg ao @Beeny por fazer essa linda sign <3)
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.