----------------------------------------------------- ----------- Criado / modificado por Runah ----------- ----------------------------------------------------- quest snow_dungeon begin state start begin function setting() return { ["bossroom_entry_pos"] = {6047,1927}, ["dungeon_entry_pos"] = {5293, 1816}, ["outside_entry_pos"] = {4319,1644}, ["room_pos"] = { {5540,1803}, -- 2nd {5880,1809}, -- 3rd {5292,2067}, -- 4th {5539,2072}, -- 5th {5865,2074}, -- 6th {5423,2251}, -- 7th {5691,2238}, -- 8th {5969,2229} -- 9th }, ["szer_pos"] = { {302,642}, {324,651}, {299,679}, {287,670}, {273,657} }, ["cube_pos"] = { {394,488}, {382,458}, {419,420}, {452,440}, {450,485} }, ["metin_stone_pos"] = {745,495}, ["tower_pos"] = {849,655}, ["boss_pos"] = {927,334} } end function is_snowd() return pc.get_map_index() >= 352*10000 and pc.get_map_index() < 353*10000 end function clear_level() d.clear_regen() d.purge_area(512000, 153600, 609300, 261600) clear_server_timer("respawn_moobs") end function cube_take(idx) if idx == 0 then d.setf("stonekill", 2) elseif idx == -1 then say("Esta não é a ordem correta.") return elseif idx == 5 then snow_dungeon.clear_level() npc.purge() notice_multiline("A sexta ronda irá começar dentro de 10 segundos.", d.notice) server_timer("snow_round5", 10, d.get_map_index()) return else d.setf("stonekill", d.getf("stonekill")+1) end npc.purge() end when 20395.chat."Torre de Vigia" with pc.get_map_index() == 61 begin local setting = snow_dungeon.setting() if party.is_party() then local pids = {party.get_member_pids()} local shamanMembers, ninjaMembers = {}, {} local notEnoughLevelMembers = {}, {} local delayedMembers = {} for idx,pid in ipairs(pids) do q.begin_other_pc_block(pid) if pc.get_level() < 100 then table.insert(notEnoughLevelMembers, pc.name) end if pc.get_job() == 1 then table.insert(ninjaMembers, pc.name) end if pc.get_job() == 3 then table.insert(shamanMembers, pc.name) end if get_global_time() - pc.getf("snow_dungeon","exit_time") < 60*60*2 then table.insert(delayedMembers, pc.name) end q.end_other_pc_block(pid) end say("Não vais sobreviver na Torre de Vigia de Nemere sozinho,") say("precisas de pelo menos dois companheiros que te ajudem a") say("combater na Torre. Deve haver um Ninja e um Xamã no grupo.") if table.getn(notEnoughLevelMembers) ~= 0 then say("Os seguintes membros do grupo não têm nível 90:") for _,name in ipairs(notEnoughLevelMembers) do say(color(1,1,0), " "..name) end return elseif table.getn(ninjaMembers) == 0 then say(color(1,1,0), "Não há Ninjas no grupo! Precisas de um!") return elseif table.getn(shamanMembers) == 0 then say(color(1,1,0), "Não há Xamãs no grupo! Precisas de um!") return elseif table.getn(delayedMembers) ~= 0 then say("Os seguintes membros do grupo não podem entrar:") for _, name in ipairs(delayedMembers) do say(color(1,1,0), " "..name) end local cooldown = 120 - math.floor((get_global_time() - pc.getqf("snow_dungeon","exit_time")) / 60) if cooldown == 1 then say_reward("Falta "..cooldown.." minuto.") elseif cooldown < 0 then say("") else say_reward("Faltam "..cooldown.." minutos.") end return end if party.is_leader() then say("Então queres entrar na Torre de Vigia de Nemere?") if select("Claro!", "Nem por isso.") == 1 then d.new_jump_party(352, setting.dungeon_entry_pos[1], setting.dungeon_entry_pos[2]) end else say(color(1,1,0), "Apenas o Líder do Grupo pode pedir para entrar.") end else say("Precisas de um grupo para entrar!") end end when login with snow_dungeon.is_snowd() and party.is_leader() begin if d.getf("started") == 0 then local setting = snow_dungeon.setting() party.setf("dungeon_index", d.get_map_index()) d.setf("started", 1) d.setf("level", 1) d.setf("party_leader_pid", party.get_leader_pid()) d.regen_file("data/dungeon/snow_dungeon/sd_1.txt") d.setf("moobs", d.count_monster()) notice_multiline("Primeira ronda.", d.notice) notice_multiline("Derrota todos os inimigos!", d.notice) end end when login with snow_dungeon.is_snowd() and d.getf("started") == 1 begin local idx = party.getf("dungeon_index") if pc.get_x() != d.getf_from_map_index("dungeon_x", idx) and pc.get_y() != d.getf_from_map_index("dungeon_y", idx) then pc.warp(d.getf_from_map_index("dungeon_x", idx)*100, d.getf_from_map_index("dungeon_y", idx)*100, idx) end end when logout with snow_dungeon.is_snowd() and d.getf("started") == 1 begin pc.setf("snow_dungeon", "exit_time", get_global_time()) end when kill with snow_dungeon.is_snowd() and d.getf("level") == 1 begin local remain_moobs = d.getf("moobs") - 1 d.setf("moobs", remain_moobs) if remain_moobs <= 0 then snow_dungeon.clear_level() notice_multiline("A segunda ronda irá começar dentro de 10 segundos.", d.notice) server_timer("snow_round1", 10, d.get_map_index()) end end when snow_round1.server_timer begin if d.select(get_server_timer_arg()) then local setting = snow_dungeon.setting() snow_dungeon.clear_level() d.regen_file("data/dungeon/snow_dungeon/sd_2.txt") d.setf("moobs", d.count_monster()) notice_multiline("Segunda ronda.", d.notice) notice_multiline("Alguns monstros da Geada estão na posse de Chaves de Geada.[ENTER]Obtém as chaves deles e descobre a correta![ENTER]No entanto, apenas Xamãs podem usar a chave.", d.notice) d.jump_all(setting.room_pos[d.getf("level")][1], setting.room_pos[d.getf("level")][2]) d.setf("dungeon_x", setting.room_pos[d.getf("level")][1]) d.setf("dungeon_y", setting.room_pos[d.getf("level")][2]) d.setf("level", 2) d.setf("key_done", 0) end end when kill with snow_dungeon.is_snowd() and d.getf("level") == 2 begin if number(1,100) < 5 then game.drop_item(30331) end local remain_moobs = d.getf("moobs") - 1 d.setf("moobs", remain_moobs) if remain_moobs <= 0 then snow_dungeon.clear_level() notice_multiline("Mais monstros irão spawnar dentro de 10 segundos.", d.notice) server_timer("respawn_moobs", 10, d.get_map_index()) end end when 30331.use with snow_dungeon.is_snowd() and pc.get_job() == 3 and d.getf("level") == 2 begin if number(1,100) < 10 then if d.getf("key_done") != 1 then d.setf("key_done", 1) snow_dungeon.clear_level() say("Esta é a chave correcta!") notice_multiline("A terceira ronda irá começar dentro de 10 segundos.", d.notice) server_timer("snow_round2", 10, d.get_map_index()) end else say("Esta chave é falsa.") end item.remove() end when snow_round2.server_timer begin if d.select(get_server_timer_arg()) then local setting = snow_dungeon.setting() snow_dungeon.clear_level() d.regen_file("data/dungeon/snow_dungeon/sd_3.txt") d.setf("moobs", d.count_monster()) notice_multiline("Terceira ronda.", d.notice) notice_multiline("Derrota todos os inimigos!", d.notice) d.jump_all(setting.room_pos[d.getf("level")][1], setting.room_pos[d.getf("level")][2]) d.setf("dungeon_x", setting.room_pos[d.getf("level")][1]) d.setf("dungeon_y", setting.room_pos[d.getf("level")][2]) d.setf("level", 3) end end when kill with snow_dungeon.is_snowd() and d.getf("level") == 3 begin local remain_moobs = d.getf("moobs") - 1 d.setf("moobs", remain_moobs) if remain_moobs <= 0 then snow_dungeon.clear_level() notice_multiline("A quarta ronda irá começar dentro de 10 segundos.", d.notice) server_timer("snow_round3", 10, d.get_map_index()) end end when snow_round3.server_timer begin if d.select(get_server_timer_arg()) then local setting = snow_dungeon.setting() snow_dungeon.clear_level() d.regen_file("data/dungeon/snow_dungeon/sd_4.txt") d.setf("moobs", d.count_monster()) notice_multiline("Quarta ronda.", d.notice) notice_multiline("Derrota todos os inimigos![ENTER]A Bênção irá encher-te de poder para a segunda vaga.", d.notice) d.jump_all(setting.room_pos[d.getf("level")][1], setting.room_pos[d.getf("level")][2]) d.setf("dungeon_x", setting.room_pos[d.getf("level")][1]) d.setf("dungeon_y", setting.room_pos[d.getf("level")][2]) d.setf("level", 4) d.setf("first_spawn", 1) end end when kill with snow_dungeon.is_snowd() and d.getf("level") == 4 and d.getf("first_spawn") == 1 begin local remain_moobs = d.getf("moobs") - 1 d.setf("moobs", remain_moobs) if remain_moobs <= 0 then snow_dungeon.clear_level() notice_multiline("A segunda vaca irá spawnar dentro de 10 segundos.", d.notice) server_timer("respawn_moobs", 10, d.get_map_index()) end end when kill with snow_dungeon.is_snowd() and d.getf("level") == 4 and d.getf("first_spawn") == 2 begin local remain_moobs = d.getf("moobs") - 1 d.setf("moobs", remain_moobs) if remain_moobs <= 0 then snow_dungeon.clear_level() notice_multiline("A quinta ronda irá começar dentro de 10 segundos.", d.notice) server_timer("snow_round4", 10, d.get_map_index()) end end when snow_round4.server_timer begin if d.select(get_server_timer_arg()) then local setting = snow_dungeon.setting() snow_dungeon.clear_level() d.regen_file("data/dungeon/snow_dungeon/sd_5.txt") d.setf("moobs", d.count_monster()) notice_multiline("Quinta ronda.", d.notice) notice_multiline("Abre os selos no Cubo Ártico na ordem correta para chegares ao próximo andar.[ENTER]Derrota os monstros da geada e obtém a sua Estrela Polar para abrires os selos!", d.notice) local vis = {0,0,0,0,0} for i = 1, 5 do local ran = number(1,5) local sum = 0 for k = 1, 50 do sum = sum+1 if sum > 5 then sum = 1 end if vis[sum] == 0 then ran = ran-1 if ran == 0 then vis[sum] = 1 d.set_unique("stone_"..sum, d.spawn_mob(20398, setting.cube_pos[i][1], setting.cube_pos[i][2])) break end end end end d.jump_all(setting.room_pos[d.getf("level")][1], setting.room_pos[d.getf("level")][2]) d.setf("dungeon_x", setting.room_pos[d.getf("level")][1]) d.setf("dungeon_y", setting.room_pos[d.getf("level")][2]) d.setf("level", 5) end end when kill with snow_dungeon.is_snowd() and d.getf("level") == 5 begin if number(1,100) < 5 then game.drop_item(30332) end local remain_moobs = d.getf("moobs") - 1 d.setf("moobs", remain_moobs) if remain_moobs <= 0 then snow_dungeon.clear_level() notice_multiline("Mais monstros irão spawnar dentro de 10 segundos.", d.notice) server_timer("respawn_moobs", 10, d.get_map_index()) end end when 20398.take with snow_dungeon.is_snowd() and item.vnum == 30332 and d.getf("level") == 5 begin local vid, kill = npc.get_vid(), d.getf("stonekill") if vid == d.get_unique_vid("stone_1") then snow_dungeon.cube_take(0) elseif vid == d.get_unique_vid("stone_2") then snow_dungeon.cube_take(kill == 2 and 2 or -1) elseif vid == d.get_unique_vid("stone_3") then snow_dungeon.cube_take(kill == 3 and 3 or -1) elseif vid == d.get_unique_vid("stone_4") then snow_dungeon.cube_take(kill == 4 and 4 or -1) else snow_dungeon.cube_take(kill == 5 and 5 or -1) end item.remove() end when snow_round5.server_timer begin if d.select(get_server_timer_arg()) then local setting = snow_dungeon.setting() snow_dungeon.clear_level() d.regen_file("data/dungeon/snow_dungeon/sd_6.txt") d.setf("moobs", d.count_monster()) notice_multiline("Sexta ronda.", d.notice) notice_multiline("Derrota todos os monstros da geada e depois destrói a Metin do Frio.[ENTER]Apenas Xamãs lhe conseguem infligir dano.", d.notice) d.jump_all(setting.room_pos[d.getf("level")][1], setting.room_pos[d.getf("level")][2]) d.setf("dungeon_x", setting.room_pos[d.getf("level")][1]) d.setf("dungeon_y", setting.room_pos[d.getf("level")][2]) d.setf("level", 6) d.setf("first_spawn", 1) end end when kill with snow_dungeon.is_snowd() and d.getf("level") == 6 and d.getf("first_spawn") == 1 begin local remain_moobs = d.getf("moobs") - 1 d.setf("moobs", remain_moobs) if remain_moobs <= 0 then snow_dungeon.clear_level() d.setf("first_spawn", 2) d.notice("A Metin do Frio apareceu!") local setting = snow_dungeon.setting() d.spawn_mob(8058, setting.metin_stone_pos[1], setting.metin_stone_pos[2]) end end when 8058.kill with snow_dungeon.is_snowd() and d.getf("level") == 6 begin snow_dungeon.clear_level() notice_multiline("A sétima ronda irá começar dentro de 10 segundos.", d.notice) server_timer("snow_round6", 10, d.get_map_index()) end when snow_round6.server_timer begin if d.select(get_server_timer_arg()) then local setting = snow_dungeon.setting() snow_dungeon.clear_level() d.regen_file("data/dungeon/snow_dungeon/sd_7.txt") for i = 1, 5 do d.spawn_mob(6151, setting.szer_pos[i][1], setting.szer_pos[i][2]) end d.setf("moobs", d.count_monster()) notice_multiline("Sétima ronda.", d.notice) notice_multiline("Encontra e derrota Szel, o Lorde do Gelo e do Frio.[ENTER]Apenas aqueles que combatem com a Ajuda do Dragão[ENTER]serão vitoriosos.", d.notice) d.jump_all(setting.room_pos[d.getf("level")][1], setting.room_pos[d.getf("level")][2]) d.setf("dungeon_x", setting.room_pos[d.getf("level")][1]) d.setf("dungeon_y", setting.room_pos[d.getf("level")][2]) d.setf("level", 7) end end when 6151.kill with snow_dungeon.is_snowd() and d.getf("level") == 7 and d.getf("7th_floor_killed") == 0 begin local count = d.getf("count_7")+1 d.setf("count_7", count) if number(count-1, 3) == count-1 then d.setf("7th_floor_killed", 1) snow_dungeon.clear_level() notice_multiline("A oitava ronda irá começar dentro de 10 segundos.", d.notice) server_timer("snow_round7", 10, d.get_map_index()) else d.notice("O seu duplo desaparece.") end end when snow_round7.server_timer begin if d.select(get_server_timer_arg()) then local setting = snow_dungeon.setting() snow_dungeon.clear_level() d.regen_file("data/dungeon/snow_dungeon/sd_8.txt") d.setf("moobs", d.count_monster()) notice_multiline("Oitava ronda.", d.notice) notice_multiline("Derrota todos os monstros da geada e encontra a Chave da Flor da Geada.[ENTER]Apenas Ninjas e Xamãs a podem usar.", d.notice) d.jump_all(setting.room_pos[d.getf("level")][1], setting.room_pos[d.getf("level")][2]) d.setf("dungeon_x", setting.room_pos[d.getf("level")][1]) d.setf("dungeon_y", setting.room_pos[d.getf("level")][2]) d.setf("level", 8) d.setf("key_done", 0) end end when kill with snow_dungeon.is_snowd() and d.getf("level") == 8 begin if number(1,100) < 5 then game.drop_item(30333) end local remain_moobs = d.getf("moobs") - 1 d.setf("moobs", remain_moobs) if remain_moobs <= 0 then snow_dungeon.clear_level() notice_multiline("Mais monstros irão spawnar dentro de 10 segundos.", d.notice) server_timer("respawn_moobs", 10, d.get_map_index()) end end when 30333.use with snow_dungeon.is_snowd() and (pc.get_job() == 1 or pc.get_job() == 3) and d.getf("level") == 8 begin if number(1,100) < 10 then if d.getf("key_done") != 1 then d.setf("key_done", 1) snow_dungeon.clear_level() say("Esta é a chave correcta!") notice_multiline("A nona ronda irá começar dentro de 10 segundos.", d.notice) server_timer("snow_round8", 10, d.get_map_index()) end else say("Esta chave é falsa.") end item.remove() end when snow_round8.server_timer begin if d.select(get_server_timer_arg()) then local setting = snow_dungeon.setting() snow_dungeon.clear_level() d.regen_file("data/dungeon/snow_dungeon/sd_9.txt") d.setf("moobs", d.count_monster()) notice_multiline("Nona ronda.", d.notice) notice_multiline("Destrói o Pilar do Dragão do Norte.[ENTER]Apenas Ninjas e Xamãs lhe conseguem infligir dano.", d.notice) d.spawn_mob(20399, setting.tower_pos[1], setting.tower_pos[2]) d.jump_all(setting.room_pos[d.getf("level")][1], setting.room_pos[d.getf("level")][2]) d.setf("dungeon_x", setting.room_pos[d.getf("level")][1]) d.setf("dungeon_y", setting.room_pos[d.getf("level")][2]) d.setf("level", 9) end end when 20399.kill with snow_dungeon.is_snowd() and d.getf("level") == 9 begin snow_dungeon.clear_level() notice_multiline("A décima ronda irá começar dentro de 10 segundos.", d.notice) server_timer("snow_round9", 10, d.get_map_index()) end when snow_round9.server_timer begin if d.select(get_server_timer_arg()) then local setting = snow_dungeon.setting() snow_dungeon.clear_level() d.regen_file("data/dungeon/snow_dungeon/sd_10.txt") d.setf("moobs", d.count_monster()) notice_multiline("Derrota Nemere, Rei do Gelo e da Geada.", d.notice) d.spawn_mob(6191, setting.boss_pos[1], setting.boss_pos[2]) d.jump_all(setting.bossroom_entry_pos[1], setting.bossroom_entry_pos[2]) d.setf("dungeon_x", setting.bossroom_entry_pos[1]) d.setf("dungeon_y", setting.bossroom_entry_pos[2]) d.setf("level", 10) end end when respawn_moobs.server_timer begin if d.select(get_server_timer_arg()) then if d.getf("level") == 2 then snow_dungeon.clear_level() d.regen_file("data/dungeon/snow_dungeon/sd_2.txt") d.setf("moobs", d.count_monster()) elseif d.getf("level") == 4 then snow_dungeon.clear_level() d.setf("first_spawn", 2) d.regen_file("data/dungeon/snow_dungeon/sd_4.txt") d.spawn_mob(6108, 159, 489) d.spawn_mob(6109, 208, 454) d.setf("moobs", d.count_monster()) elseif d.getf("level") == 5 then snow_dungeon.clear_level() d.regen_file("data/dungeon/snow_dungeon/sd_5.txt") d.setf("moobs", d.count_monster()) elseif d.getf("level") == 8 then snow_dungeon.clear_level() d.regen_file("data/dungeon/snow_dungeon/sd_8.txt") d.setf("moobs", d.count_monster()) end end end when 6191.kill with snow_dungeon.is_snowd() and d.getf("level") == 10 begin snow_dungeon.clear_level() notice_multiline("Derrotaste o Nemere, Rei do Gelo e da Geada, serás teleportado dentro de 2 minutos.", d.notice) notice_all("O grupo de "..pc.name.." derrotou o Rei do Gelo e da Geada, Nemere!") server_timer("snow_dungeon_end_timer", 120, d.get_map_index()) end when snow_dungeon_end_timer.server_timer begin if d.select(get_server_timer_arg()) then d.set_warp_location(61, snow_dungeon.setting().outside_entry_pos[1] , snow_dungeon.setting().outside_entry_pos[2]) d.setf("party_leader_pid", 0) d.exit_all() end end end end