* Sobre o Sistema da Quest *
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:
* 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:
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:
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.
Download dos arquivos zipados: Arquivos - Quest Baú SAO - Lordzetros.zip
Scan do arquivo: https://www.virustotal.com/pt/file/10e6bf2be0ccb33838a75198e5f822c1c8888f4c8652dcfc5235f87260a7582a/analysis/1540133843/