Ir para conteúdo

Featured Replies

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

 

mPYUhVp.png
 
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.
 
 
mPYUhVp.png
 
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
 
 
mPYUhVp.png
 
 
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" />
 
mPYUhVp.png
 
 
 
As estátuas precisam estar nesse formato circular para que o efeito das animações possam acontecer corretamente.
 
jsja8n.jpg
 
 
Vídeo:
https://www.youtube.com/watch?v=kBVUf_ejmLs&feature=youtu.be
 
 
Download OTServ para demonstração da Quest:

Editado por Frenesy (veja o histórico de edições)

  • 2 weeks later...
  • Respostas 19
  • Visualizações 1.9k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • Fiz uma pequena modificação no Script. Removi repetições desnecessárias e adicionei uma tabela de configuração no início do Script para facilitar a instalação.

Posted Images

Postado

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: 

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

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