Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

* Sobre o Sistema da Quest * 
Sword_Art_Online_Episode_3.thumb.png.c7996bdb1aa6ad50a826d747eebfcf5d.png

 

Para quem já assistiu Sword Art Oline vai ficar fácil de entender. Jogadores poderão fazer uma quest simples, porém, diferenciada. Funciona da seguinte forma:
1 - Jogador terá que possuir uma chave para abrir o caminho de uma sala misteriosa e aparentemente cheia de tesouros e recompensas dentro de um baú

2 - Abrindo a passagem, ele vai se deparar com um baú em sua espera, o interesse do ser humano é devastador, ele irá abrir sim!

3 - Ao tentar abrir o baú, monstros serão invocados e a passagem será imediatamente fechada

4 - De todos os monstros que serão invocados, terá um chefe que será responsável por permitir a saída dos jogadores para sala de recompensa e sair daquele lugar, APENAS matando ele, isso será possível

5 - Após a morte do chefe, TODOS players na sala da quest serão teleportados para a área de recompensa configurada no script.

 

Obs.: A quest tá configurada para ser feita em X minutos para TODO servidor, ou seja, se uma guild fez a quest e você configurou para ela ser feita novamente em 10 minutos, então, nenhum outro player poderá fazer a quest nesse intervalo, pois a storage armazenada é a do servidor.

 

* Instalação * 

VERSÃO TESTADA: 8.6 - TFS 0.4

Para agilizar o processo, deixei como anexo todos os arquivos necessários, devidamente separados e organizados, caso queira baixar, o ViruScan dele está logo abaixo.

Em data/actions/scripts/

1° - Crie um arquivo chamado keySAO.lua e cole o seguinte código dentro:

 

--[[
Script - Lordzetros
Tibiaking - Lordzetros
]]--

local config = {
  parede = {id = 9784, pos = {x = 959, y = 941, z = 6, stackpos = 1}}, -- ID da parede |||| POSIÇÃO que ela irá ser criada
  strPassagem = {storage = 22338, tempo = 1}, -- Storage que vai controlar o tempo de intervalo para a quest ||||| tempo em MINUTOS de intervalo para os players fazer a quest novamente
  tempoFechar = 1, -- MINUTOS para a passagem fechar, caso não entrem APÓS abrirem a passagem
}

function remover_parede(conf)
  local parede = getTileItemById(conf.parede.pos, conf.parede.id)
  if (parede) then
    doRemoveItem(parede.uid, 1)
    doSendMagicEffect(conf.parede.pos, 10)
  end
  return true
end

function adicionar_parede(conf)
  local parede = getThingFromPos(conf.parede.pos).itemid ~= conf.parede.id
  if (parede) then return doCreateItem(conf.parede.id, 1, conf.parede.pos) and doSendMagicEffect(conf.parede.pos, 11) end
  return true
end

function onUse(cid, item, fromPos, item2, toPos)
  if (item2.itemid == config.parede.id) then
    if (getGlobalStorageValue(config.strPassagem.storage) >= os.time()) then return doCreatureSay(cid, 'Precisa esperar ' .. config.strPassagem.tempo .. ' minuto para fazer a quest!', TALKTYPE_ORANGE_1)

  end
  doRemoveItem(item2.uid, 1)
  doSendMagicEffect(config.parede.pos, 10)
  doCreatureSay(cid, "A passagem foi aberta por "..getPlayerName(cid).."! Peguem a recompensa no bau, depressa!", TALKTYPE_ORANGE_1)
  doPlayerSendCancel(cid, "A passagem ira fechar em " ..config.tempoFechar.. " minuto!")
  addEvent(function()
  adicionar_parede(config)
  end, config.tempoFechar * 60 * 1000)
  doRemoveItem(item.uid, 1)
end
return true
end

 

Em seguida, crie outro arquivo no mesmo local com o nome de bauSAO.lua e cole o código dentro:

--[[
Script - Lordzetros
Tibiaking - Lordzetros
]]

local mti = {
    [1] = {nome = 'Demon', pos = {x=955, y=935, z=6}}, -- [numero] = {nome = 'Nome Monstro', pos = 'POSICAO QUE IRÁ RESPAWNAR O MONSTRO'}
    [2] = {nome = 'Demon', pos = {x=955, y=936, z=6}},
    [3] = {nome = 'Demon', pos = {x=955, y=937, z=6}},
    [4] = {nome = 'Demon', pos = {x=955, y=938, z=6}},
    [5] = {nome = 'Demon', pos = {x=955, y=939, z=6}},
    [6] = {nome = 'Demon', pos = {x=955, y=940, z=6}},
    [7] = {nome = 'Demon', pos = {x=964, y=935, z=6}},
    [8] = {nome = 'Demon', pos = {x=964, y=936, z=6}},
    [9] = {nome = 'Demon', pos = {x=964, y=937, z=6}},
    [10] = {nome = 'Demon', pos = {x=964, y=938, z=6}},
    [11] = {nome = 'Demon', pos = {x=964, y=939, z=6}},
    [12] = {nome = 'Demon', pos = {x=964, y=940, z=6}},
    [13] = {nome = 'Loki', pos = {x=959, y=940, z=6}},
}

local config = {
unique = 17458, -- uniqueID que vai colocar no BAÚ no seu EDITOR DE MAPA!
parede = {id = 9784, pos = {x = 959, y = 941, z = 6, stackpos = 1}}, -- ID da parede |||| POSIÇÃO que ela irá ser criada
strPassagem = {storage = 22338, tempo = 1}, -- Storage que vai controlar o tempo de intervalo para a quest ||||| tempo em MINUTOS de intervalo para os players fazer a quest novamente
}

function adicionar_parede(conf)
    local parede = getThingFromPos(conf.parede.pos).itemid ~= conf.parede.id
    if (parede) then return doCreateItem(conf.parede.id, 1, conf.parede.pos) and doSendMagicEffect(conf.parede.pos, 11) end
    return true
end

function onUse(cid, item, fromPos, item2, toPos)
    if (item.uid == config.unique) then
        if (getGlobalStorageValue(config.strPassagem.storage) >= os.time()) then return doCreatureSay(cid, 'Precisa esperar ' .. config.strPassagem.tempo .. ' minuto para fazer a quest!', TALKTYPE_ORANGE_1) end
        doCreatureSay(cid, "Argh!! Sala com armadilha.", TALKTYPE_ORANGE_1)
        adicionar_parede(config)
        for _, cf in pairs(mti) do
            doSummonCreature(cf.nome, cf.pos)
        end
        setGlobalStorageValue(config.strPassagem.storage, os.time() + config.strPassagem.tempo * 60)
    end
    return true
end

Adicione as seguintes linhas de código em data/actions/actions.xml

<action uniqueid="17458" event="script" value="bauSAO.lua"/>
<action itemid="IDdaKEY" event="script" value="keySAO.lua" />

2° - Agora em data/creaturescripts/scripts

Crie um arquivo chamado tpSAO.lua e cole o código dentro:

--[[
Script - Lordzetros
Tibiaking - Lordzetros
]]

local config = {
SupEsquerdo = {x=953, y=930, z=6}, -- posicao do canto SUPERIOR ESQUERDO da área que ficará a quest
InfDireito = {x=966, y=941, z=6}, -- posicao do canto INFERIOR DIREITO da área que ficará a quest
chefe = "Loki", -- Nome do BOSS, responsável por abrir passagem e liberar a recompensa no baú
parede = {id = 9784, pos = {x = 959, y = 941, z = 6, stackpos = 1}}, -- id da parede   |||||   posicao dela
posPremio = {x = 1263, y = 1128, z = 7}, -- posicao para area de recompensa quando os players matarem o boss
msgSucesso = "Parabéns por passarem do desafio! Agora permitirei pegar algumas recompensas como reconhecimento de um otimo guerreiros que es!" -- Mensagem quando os players conseguirem matar o boss da sala
}

function getAllPlayersInArea(fromPosition, toPosition)
        local players = {}
        for _, pid in ipairs(getPlayersOnline()) do
            local f = {x = fromPosition.x, y = fromPosition.y, z = fromPosition.z}
            local t = {x = toPosition.x, y = toPosition.y, z = toPosition.z}
            local min = (fromPosition.z > toPosition.z and toPosition.z or fromPosition.z)
            for index = 0, math.abs(toPosition.z - fromPosition.z) do
                f.z = min + index
                t.z = min + index
                if (isInRange(getPlayerPosition(pid), f, t)) then
                    table.insert(players, pid)
                end
            end    
        end
        return players
    end 

function remover_parede(conf)
    local parede = getTileItemById(conf.parede.pos, conf.parede.id)
    if (parede) then
        doRemoveItem(parede.uid, 1)
        doSendMagicEffect(conf.parede.pos, 10)
    end
    return true
end

function adicionar_parede(conf)
    local parede = getThingFromPos(conf.parede.pos).itemid ~= conf.parede.id
    if (parede) then return doCreateItem(conf.parede.id, 1, conf.parede.pos) and doSendMagicEffect(conf.parede.pos, 11) end
    return true
end

function onDeath(cid)
    local boss = getCreatureName(cid) == config.chefe
    if boss then
        doCreatureSay(cid, config.msgSucesso, TALKTYPE_ORANGE_1)
        doSendMagicEffect(getCreaturePosition(cid), 49)
        addEvent(function()
            local players = getAllPlayersInArea(config.SupEsquerdo, config.InfDireito)
            for _, jogador in ipairs(players) do
                doTeleportThing(jogador, config.posPremio)
                doSendMagicEffect(getPlayerPosition(jogador), 11)
            end
        end, 7000)
    end
    return true
end

Adicione a seguinte linha de código em data/creaturescripts/creaturescripts.xml

<event type="death" name="tpSao" script="tpSAO.lua"/>

Em data/creaturescripts/scripts/login.lua adicione esta linha de código abaixo do último registerCreatureEvent

 

3° - Por fim, agora escolhe um monstro que será o chefe responsável por permitir que os jogadores saiam do local e que leve-os até a sala de recompensa após o derrotarem.

Escolheu? Show, agora vá até o diretório dele em data/monster/pastaDoSeumonstro/arquivoDoSeuMonstro.xml e adicione essas linhas de códigos abaixo de alguma tag, no meu caso, utilizei abaixo da tag flags

<script>
    <event name="tpSao"/>
</script>

Segue foto para melhor entendimento: 

770447605_download(4).thumb.png.eb0fd5fe04fee7a08fd76b04f1afd8df.png

 

 

* Explicação da configuração *

 

Bom, apesar de está TUDO COMENTADO e AJUSTÁVEL, acho importante dá algumas explicações:

1 - Configurou tudo nas pastas corretamente, colocou todas linhas de códigos necessárias e explicadas? Beleza, você tá quase lá.

2 - Coloque em um baú no seu editor de mapa um UNIQUEID que será responsável por identificar que aquele BAÚ é da quest, segue imagem:

unique-BAU.png.37f2df7d509c77734e1c79750bf6605e.png

Aconselho não modificar o valor, pois é muito improvável que já esteja sendo utilizado em seu servidor.

 

3 - Agora entrando na parte dos scripts:

No arquivo keySAO.lua localizado em data/actions/scripts/

local config = {
parede = {id = 9784, pos = {x = 959, y = 941, z = 6, stackpos = 1}}, -- ID da parede |||| POSIÇÃO que ela irá ser criada
strPassagem = {storage = 22338, tempo = 1}, -- Storage que vai controlar o tempo de intervalo para a quest ||||| tempo em MINUTOS de intervalo para os players fazer a quest novamente
tempoFechar = 1, -- MINUTOS para a passagem fechar, caso não entrem APÓS abrirem a passagem
}

Configure o id da parede que impedirá a passagem dos players e o jogador utilizará a chave nela para passar! Não esqueça de configurar a posição dela também, deixe a mesma que você colocou no mapa.
Configure o storage que será responsável por permitir ou não jogadores fazerem a quest em X minutos.
Configure o tempo que o player terá para passar para dentro da sala antes que a passagem se feche, no script tá 1 minuto.

 

No arquivo bauSAO.lua localizado em data/actions/scripts/

local mti = {
    [1] = {nome = 'Demon', pos = {x=955, y=935, z=6}}, -- [numero] = {nome = 'Nome Monstro', pos = 'POSICAO QUE IRÁ RESPAWNAR O MONSTRO'}
    [2] = {nome = 'Demon', pos = {x=955, y=936, z=6}},
    [3] = {nome = 'Demon', pos = {x=955, y=937, z=6}},
    [4] = {nome = 'Demon', pos = {x=955, y=938, z=6}},
    [5] = {nome = 'Demon', pos = {x=955, y=939, z=6}},
    [6] = {nome = 'Demon', pos = {x=955, y=940, z=6}},
    [7] = {nome = 'Demon', pos = {x=964, y=935, z=6}},
    [8] = {nome = 'Demon', pos = {x=964, y=936, z=6}},
    [9] = {nome = 'Demon', pos = {x=964, y=937, z=6}},
    [10] = {nome = 'Demon', pos = {x=964, y=938, z=6}},
    [11] = {nome = 'Demon', pos = {x=964, y=939, z=6}},
    [12] = {nome = 'Demon', pos = {x=964, y=940, z=6}},
    [13] = {nome = 'Loki', pos = {x=959, y=940, z=6}},
}

local config = {
unique = 17458, -- uniqueID que vai colocar no BAÚ no seu EDITOR DE MAPA!
parede = {id = 9784, pos = {x = 959, y = 941, z = 6, stackpos = 1}}, -- ID da parede |||| POSIÇÃO que ela irá ser criada
strPassagem = {storage = 22338, tempo = 1}, -- Storage que vai controlar o tempo de intervalo para a quest ||||| tempo em MINUTOS de intervalo para os players fazer a quest novamente
}

Configure os nomes e posições que os monstros irão respawnar, e repare que deixei apenas 1 diferenciado chamado 'Loki', pois foi o monstro que escolhi como CHEFE 
Configure o uniqueID que será utilizado no baú, recomendo não mexer nessa parte
Configure novamente o ID da parede que irá bloquear a passagem e a mesma posição (use a mesma coisa da configuração anterior)
Configure novamente o storage e tempo que permitirá os jogadores fazerem a quest em X minutos (use a mesma coisa da configuração anterior)

 

No arquivo tpSAO.lua em data/creaturescripts/scripts/

local config = {
SupEsquerdo = {x=953, y=930, z=6}, -- posicao do canto SUPERIOR ESQUERDO da área que ficará a quest
InfDireito = {x=966, y=941, z=6}, -- posicao do canto INFERIOR DIREITO da área que ficará a quest
chefe = "Loki", -- Nome do BOSS, responsável por abrir passagem e liberar a recompensa no baú
parede = {id = 9784, pos = {x = 959, y = 941, z = 6, stackpos = 1}}, -- id da parede   |||||   posicao dela
posPremio = {x = 1263, y = 1128, z = 7}, -- posicao para area de recompensa quando os players matarem o boss
msgSucesso = "Parabéns por passarem do desafio! Agora permitirei pegar algumas recompensas como reconhecimento de um otimo guerreiros que es!" -- Mensagem quando os players conseguirem matar o boss da sala
}

Configure o canto superior esquerdo e inferior direito, é de EXTREMA importância isso, pois será responsável por verificar os jogadores na sala da quest e teleportá-los, segue imagem:

Screenshot_28.thumb.png.64e02b39cd075e23a536247eaaef9900.png

                                              Coloque as posições corretamente de cada canto.

 

Configure o nome do chefe que você escolheu para completar a quest, o monstro diferenciado que falamos lá em cima, certo?

Configure novamente o ID da parede que irá bloquear a passagem e a mesma posição (use a mesma coisa da configuração anterior)
Configure a posição do prêmio, isto é, a posição que o player será teleportado quando matar o CHEFE, a posição da SALA DE RECOMPENSAS ou seja lá o que queira fazer após os jogadores matarem o chefe.
Configure a mensagem, caso queira, de quando os jogadores matarem o CHEFE da sala.

 

 

* Observações finais e anexos para download * 

 

Digo logo que é um script simples, porém bastante trabalhoso de ser configurado, visto que faz-se necessário a instalação de alguns arquivos, mas não deixa de ser simples! 

A ideia que tive foi quando estava lembrando do anime, e como estou voltando aos poucos com Tibia (aprendendo bastante), tive a ideia de fazer isso, pois como gostava bastante de jogar em Baiak e modos semelhantes, isso daqui pode ser bastante útil. Ah! E deixe-me alertá-lo, é um sistema simples que não está 100% como eu desejava, portanto, quando tiver tempo estarei atualizando e deixando com mínimo de incoerência possível no funcionamento dele. 

POR FAVOR, faça o trabalho de ler as configurações do script, está tudo organizadinho para que você configure lá e deixe da maneira mais prática possível. Acredito que isso é tudo, abraços, \o.

Screenshot_30.thumb.png.3b3ed143c898047a2f8c31a1fa474642.pngScreenshot_31.thumb.png.faf5dcb9ca089ffceb20315140c1a3a3.pngScreenshot_29.thumb.png.65032ae729f305f438bb2e6c3bdbdca3.png

 

Download dos arquivos zipados: Arquivos - Quest Baú SAO - Lordzetros.zip

Scan do arquivo: https://www.virustotal.com/pt/file/10e6bf2be0ccb33838a75198e5f822c1c8888f4c8652dcfc5235f87260a7582a/analysis/1540133843/ 

Feliz daquele que ensina o que sabe, e aprende o que ensina.

 

               

star-wars-animated-gif-23.gif

  • Respostas 10
  • Visualizações 5k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • @FlavioHulk Gostaria de saber também, simplesmente ficou bugado quando postei. ?  @FlavioHulk Pronto, consegui arrumar o bug. @TibiaKing Aos desenvolvedores do fórum, o motivo do post ter buga

  • @Darci Santos Verificou todas as etapas se estão instaladas corretamente no servidor? Registrou no monster o script?   @elielder Abre o notepad++ com este código que está dando errado, lá em

Posted Images

Postado
  • Autor

@FlavioHulk Gostaria de saber também, simplesmente ficou bugado quando postei. ? 

@FlavioHulk Pronto, consegui arrumar o bug.

@TibiaKing Aos desenvolvedores do fórum, o motivo do post ter bugado antes, foi a tag spoiler, ficou tudo sublinhado, aconselho darem uma olhadinha nisso. 

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

Feliz daquele que ensina o que sabe, e aprende o que ensina.

 

               

star-wars-animated-gif-23.gif

Postado

Parabéns, seu tópico de conteúdo foi aprovado!
Muito obrigado pela sua contribuição, nós do Tibia King agradecemos.
Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP.

Spoiler

Congratulations, your content has been approved!
Thank you for your contribution, we of Tibia King we are grateful.
Your content will help many other users, you received +1 REP.

 

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.

Conteúdo Similar

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo