Postado Janeiro 25, 2015 10 anos Este é um post popular. Versão do Server: 8.60 O Objetivo é sincronizar as estátuas de seus respectivos elementos para criar um portal. Utilizei Actions para Girar as Estátuas e fazer a verificação das posições e Movements para fazer com que as Estátuas se posicionem de maneira aleatória, para que assim, qualquer jogador tenha uma experiência nova ao fazer a Quest. Cada estátua tem seu elemento. As estátuas da esquerda são o padrão. Você deve ajustar as estátuas da direita de acordo com o padrão estabelecido da esquerda. Uma sala é formada por dois grupos de estátuas. 6 na esquerda, 6 na direita. Cada Elemento possui duas estátuas diferentes. Uma do lado esquerdo, outra do lado direito (Notar imagem abaixo). As estátuas do lado esquerdo possui ActionID. Elas não giram. Elas que geram um padrão para posicionar as outras estátuas. O Objetivo é posicionar a estátua do lado direito do elemento fogo, por exemplo, de acordo com a posição da estátua do lado esquerdo com o mesmo elemento. Movements: Crie um arquivo .lua com nome EPQ em Movements/Script/ e coloque o código abaixo dentro dele. (Configure o local das estátuas) function onStepIn(cid, item, position, fromPosition) local pos_enter = {x = 999, y = 1009, z = 7} local statues = { -- Estátuas que ficam na posição esquerda {x = 997, y = 993, z = 7, stackpos= 1}, {x = 995, y = 994, z = 7, stackpos= 1}, {x = 994, y = 996, z = 7, stackpos= 1}, {x = 994, y = 998, z = 7, stackpos= 1}, {x = 995, y = 1000, z = 7, stackpos= 1}, {x = 997, y = 1001, z = 7, stackpos= 1}, -- Estátuas que ficam na posição direita {x = 1001, y = 993, z = 7, stackpos= 1}, {x = 1003, y = 994, z = 7, stackpos= 1}, {x = 1004, y = 996, z = 7, stackpos= 1}, {x = 1004, y = 998, z = 7, stackpos= 1}, {x = 1003, y = 1000, z = 7, stackpos= 1}, {x = 1001, y = 1001, z = 7, stackpos= 1}, } doTeleportThing(cid, pos_enter, true) for _, pos in ipairs(statues) do local lv = getThingfromPos(pos).uid doTransformItem(lv, math.random(3705, 3708)) end return TRUE end Adicione essa tag em Movements.xml <movevent type="StepIn" actionid="5485" event="script" value="EPQ.lua"/> No piso, coloque ActionID: 5485. Actions: Crie um arquivo .lua com nome EPQ em Action/Script/ e coloque o código abaixo dentro dele. function onUse(cid, item, frompos, item2, topos) if (item.actionid ~= 15784) then -- As Estatuas que tenham essa Action não podem ser movidas. 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 else doSendMagicEffect(getPlayerPosition(cid), 2) end return TRUE end Em Action.xml adicione essa tag. <action itemid="3705-3708" event="script" value="EPQ.lua"/> Nas estátuas da esquerda, coloque nelas ActionID: 15784 Crie um arquivo .lua com nome EPQUm em Action/Script/ e coloque o código abaixo dentro dele. (Configurações estão no início do Script) -- Config. local config = { 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. tp = {x = 999, y = 994, z = 7}, -- Posição que o Teleport apareceu, para que ele seja removido. tempo = 5, -- Tempo que o Teleport ficará disponível, em segundos } local posA = { -- Estátuas que ficam na posição esquerda {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 -- Estátuas que ficam na posição direita {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 } -- Fim da Config. function onUse(cid, item, frompos, item2, topos) local posC = { [1] = getThingfromPos(posA[1]), [2] = getThingfromPos(posA[10]), [3] = getThingfromPos(posA[2]), [4] = getThingfromPos(posA[9]), [5] = getThingfromPos(posA[3]), [6] = getThingfromPos(posA[11]), [7] = getThingfromPos(posA[4]), [8] = getThingfromPos(posA[12]), [9] = getThingfromPos(posA[5]), [10] = getThingfromPos(posA[7]), [11] = getThingfromPos(posA[6]), [12] = getThingfromPos(posA[8]), } if getPlayerStorageValue(cid, 10000) == -1 then 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) setPlayerStorageValue(cid, 10001, 1) addEvent(CombCerta, 1000, cid) else doSendMagicEffect(getPlayerPosition(cid), 13) setPlayerStorageValue(cid, 10000, 1) addEvent(doSendMagicEffect, 500, posA[11], 17) addEvent(doSendMagicEffect, 500, posA[3], 17) addEvent(doSendMagicEffect, 1500, posA[9], 44) addEvent(doSendMagicEffect, 1500, posA[2], 44) addEvent(doSendMagicEffect, 2500, posA[8], 46) addEvent(doSendMagicEffect, 2500, posA[6], 46) addEvent(doSendMagicEffect, 3500, posA[12], 50) addEvent(doSendMagicEffect, 3500, posA[4], 50) addEvent(doSendMagicEffect, 4500, posA[7], 43) addEvent(doSendMagicEffect, 4500, posA[5], 43) addEvent(doSendMagicEffect, 5500, posA[10], 6) addEvent(doSendMagicEffect, 5500, posA[1], 6) addEvent(doSendMagicEffect, 6500, getPlayerPosition(cid), 13) addEvent(setPlayerStorageValue, 6502, cid, 10000, -1) end else doSendMagicEffect(getThingPos(cid), 2) end return TRUE end function CombCerta(cid) local posC = { [1] = getThingfromPos(posA[1]), [2] = getThingfromPos(posA[10]), [3] = getThingfromPos(posA[2]), [4] = getThingfromPos(posA[9]), [5] = getThingfromPos(posA[3]), [6] = getThingfromPos(posA[11]), [7] = getThingfromPos(posA[4]), [8] = getThingfromPos(posA[12]), [9] = getThingfromPos(posA[5]), [10] = getThingfromPos(posA[7]), [11] = getThingfromPos(posA[6]), [12] = getThingfromPos(posA[8]), } 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) setPlayerStorageValue(cid, 10001, -1) 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) setPlayerStorageValue(cid, 10001, -2) 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) setPlayerStorageValue(cid, 10001, -3) 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) setPlayerStorageValue(cid, 10001, -4) 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) setPlayerStorageValue(cid, 10001, -5) 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) setPlayerStorageValue(cid, 10001, -6) setPlayerStorageValue(cid, 10001, 7) elseif getPlayerStorageValue(cid, 10001) == 7 then for _, pos in ipairs(posA) do doSendDistanceShoot(pos, config.Pos, 35) end doSendMagicEffect(config.Pos, 10) doCreateTeleport(1387, config.toPos, config.Pos) doCreatureSay(cid, "O teleport irá sumir em "..config.tempo.." segundos.", TALKTYPE_ORANGE_1) addEvent(removetp, config.tempo*1000, cid) end end function removetp(cid) for _, ale in ipairs(posA) do local st = getThingfromPos(ale).uid doTransformItem(st, math.random(3705, 3708)) end local t = getTileItemById(config.Pos, 1387) doRemoveItem(t.uid, 1) doSendMagicEffect(config.Pos, CONST_ME_POFF) setPlayerStorageValue(cid, 10000, -1) end Em Action.xml adicione essa tag. <action actionid="8798" event="script" value="EPQUm.lua" /> As estátuas precisam estar nesse formato circular para que o efeito das animações possam acontecer corretamente. Vídeo: https://www.youtube.com/watch?v=kBVUf_ejmLs&feature=youtu.be Download OTServ para demonstração da Quest: CLIQUE AQUI Editado Fevereiro 14, 2015 10 anos por Frenesy (veja o histórico de edições)
Postado Fevereiro 4, 2015 10 anos Criatividade e Inovação: 18/25 -- 5,5/12,5 de código e 12,5/12,5 de execução Aplicabilidade: 13/15 Simplicidade e Organização: 5/10 Nota final: 7,2 Comentário final: Seu script rodando é lindo, mas o código está repetitivo e podia ser simplificado. Você também identou de maneira errada e fez o script tomar um formato piramidal, o correto é só usar separação pra indicar blocos de código. Mostrar conteúdo oculto ex: function pairsByKeys(t, f) -- Lua.org local a = {} for n in pairs(t) do table.insert(a, n) end table.sort(a, f) local i = 0 -- iterator variable local iter = function () -- iterator function i = i + 1 if a[i] == nil then return nil else return a[i], t[a[i]] end end return iter end isso é uma identação correta, o if está na mesma linha do seu else e seu end. Oque te salvou foi que sua idéia foi genial, sério, jamais pensaria numa coisa assim. É simples, é bom. Sua idéia foi um exemplo de "Menos é mais" e foi um dos poucos scripts que eu vi em que realmente precisava achar a lógica pra ganhar o prêmio.
Postado Fevereiro 4, 2015 10 anos Autor Bom, como eu já havia dito: Ainda bem que no concurso, vale mais a criatividade do que o Script em si. Ainda estou estudando tables e algumas coisinhas amais em LUA. Certamente no próximo concurso estarei melhor. Obrigado!
Postado Fevereiro 5, 2015 10 anos Obrigado por participar do concurso, espero que também participe dos próximos. O tópico foi movido para a área correta.
Postado Fevereiro 6, 2015 10 anos Cara, script muito bom. Principalmente para que tem criatividade para Quest, ou seja eu rsrsrs. Parabéns.
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.