Skocz do zawartości
Opublikowano

Hej, bawiłem się teraz w misję na dungeon z baronówką. Generalnie to zależy mi właśnie na tych zasadach jakie napisałem w queście. 3 osoby w pt minimum, tylko baronówka do sklepania, wymóg od każdego członka przepustki, oraz godzinny cooldown. Próbowałem zrobić to na zasadzie questów dungeonowych od plechito, a że jestem zielony to ciężko mi się połapać co mogłem zrobić źle, bądz czego nie dodałem. Jeśli ktoś ma czas by na to zerknąć i chętnie by pomógł to by było super.

baron_dungeon.lua

Rozwiązane przez Gargamel

Przejdź do rozwiązania

Featured Replies

Opublikowano
  • Rozwiązanie
--[[
    Quest: Kryjówka Baronówny
    Edit by: Gargamel
    Data: 15.10.2024
    Opis: edit dla uzytkownika forum sharegon.pl
]]

quest baron begin
	state start begin
	function settings()
		return
		{
			["baron_dungeon_index"] = 193,
			["baron_dungeon_warp"] = {881,6148},
			["index_out"] = 193,
			["out_pos"] = {691, 6118},
			["level_check"] = {
				["minimum"] = 60,
				["maximum"] = 70
			},
			["pass"] = 30324,
			["main_npc"] = 9257, 				
			["main_npc_pos"] = {178, 485},
			["baron"] = 2092, 				
			["baron_pos"] = {371, 589},
		};
	end
	
	--------PARTY AND ENTER
	function party_get_member_pids()
		return party.get_member_pids()
	end
	
	function is_baroned()
		local pMapIndex = pc.get_map_index();
		local data = baron_dungeon.settings();
		local map_index = data["baron_dungeon_index"];

		return pc.in_dungeon() and pMapIndex >= map_index*10000 and pMapIndex < (map_index+1)*10000;
	end
	
	function clear_barondungeon()
		d.clear_regen();
		d.kill_all();
	end
	
	function clear_barontimers()
		clear_server_timer("baron_dungeon_wave_kill", get_server_timer_arg())
		clear_server_timer("baron_dungeon_20min_left", get_server_timer_arg())
		clear_server_timer("baron_dungeon_10min_left", get_server_timer_arg())
		clear_server_timer("baron_dungeon_5min_left", get_server_timer_arg())
		clear_server_timer("baron_dungeon_1min_left", get_server_timer_arg())
		clear_server_timer("baron_dungeon_0min_left", get_server_timer_arg())
		clear_server_timer("baron_dungeon_final", get_server_timer_arg())
	end
	
	function check_enter()
		say("")
		say("")
		say("")
		say_title(mob_name(9257))
		local settings = baron_dungeon.settings()
		
		if ((get_global_time() - pc.getf("baron_dungeon","exit_baron_dungeon_time")) < 60*60) then
		
			local remaining_wait_time = (pc.getf("baron_dungeon","exit_baron_dungeon_time") - get_global_time() + 60*60)
			say("Musisz zaczekać godzinę, jeśli chcesz wejść ponownie.")
			say_reward("Możesz wejść ponownie za: "..get_time_remaining(remaining_wait_time)..'[ENTER]')
			return
		end
		
		if party.is_party() then			
			if not party.is_leader() then
				say_reward("Pozwól, że porozmawiam z twoim Liderem.")
				return
			end

			if party.get_near_count() < 3 then
				say_reward("Twoja grupa musi zawierać minimum")
				say_reward("3 członków, którzy muszą")
				say_reward("znajdować się w pobliżu.")
				return false;
			end
			
			local levelCheck = true
			local passCheck = true
			local MemberHaveLowLevel = {}
			local MemberHaveHighLevel = {}
			local MemberHaveNoTicket = {}
			local pids = {party.get_member_pids()}
			
			if not party.is_map_member_flag_lt("exit_baron_dungeon_time", get_global_time() - 60 * 60 ) then
				say_reward("Niektórzy członkowie grupy muszą")
				say_reward("jeszcze chwilę poczekać.")
				return false;
			end
						
			for i, pid in next, pids, nil do
				q.begin_other_pc_block(pid)
				if pc.get_level(pid) < settings["level_check"]["minimum"] then
					table.insert(MemberHaveLowLevel, pc.get_name())
					levelCheck = false
				end
				q.end_other_pc_block()
			end

			if not levelCheck then
				say_reward("Jeśli chcesz wejść na dungeon,")
				say_reward("każdy członek grupy musi posiadać minimum 60 poziom.")
				say_reward("")
				say_reward("Gracze bez odpowiedniego poziomu: ")
				for i, n in next, MemberHaveLowLevel, nil do
					say_title("- "..n)
				end
				return
			end
			
			for i, pid in next, pids, nil do
				q.begin_other_pc_block(pid)
				if pc.get_level(pid) > settings["level_check"]["maximum"] then
					table.insert(MemberHaveHighLevel, pc.get_name())
					levelCheck = false
				end
				q.end_other_pc_block()
			end

			if not levelCheck then
				say_reward("Jeśli chcesz wejść na dungeon,")
				say_reward("każdy członek grupy musi posiadać maksymalnie 70 poziom.")
				say("")
				say_reward("Gracze bez odpowiedniego poziomu:")
				for i, n in next, MemberHaveHighLevel, nil do
					say_title("- "..n)
				end
				return
			end
			
			for i, pid in next, pids, nil do
				q.begin_other_pc_block(pid)
				if pc.count_item(settings.pass) < 1 then
					table.insert(MemberHaveNoTicket, pc.get_name())
					passCheck = false
				end
				q.end_other_pc_block()
			end

			if not passCheck then
				say_reward("Jeśli chcesz wejść na dungeon,")
				say_reward("każdy członek grupy musi posiadać:")
				say_item("Pajęczy Klucz", settings["pass"], "")
				say("")
				say_reward("Gracze bez Pajęczego Klucza:")
				for i, n in next, MemberHaveNoTicket, nil do
					say_title("- "..n)
				end
				return
			end
	
		else
		
			if ((get_global_time() - pc.getf("baron_dungeon","exit_baron_dungeon_time")) < 60*60) then
			
				local remaining_wait_time = (pc.getf("baron_dungeon","exit_baron_dungeon_time") - get_global_time() + 60*60)
				say("Musisz zaczekać przed ponownym wejściem do lochu.")
				say_reward("Możesz udać się ponownie za: "..get_time_remaining(remaining_wait_time)..'[ENTER]')
				return
			end
			
			if (pc.get_level() < settings["level_check"]["minimum"]) then
				say(string.format("Minimalny poziom by wejść do lochu to %d.", settings["level_check"]["minimum"]))
				return false;
			end
			
			if (pc.get_level() > settings["level_check"]["maximum"]) then
				say(string.format("Maksymalny poziom by wejść do lochu to %d.", settings["level_check"]["maximum"]))
				return false;
			end
			
			if (pc.count_item(settings["pass"]) < 1) then
				say_reward("Jeśli chcesz wejść na dungeon,")
				say_reward("musisz posiadać ")
				say_item("Pajęczy Klucz", settings["pass"], "")
				return false;
			end
		end
		
		return true;
	end
	
	------------CREATE DUNGEON
	function create_dungeon()
		local setting = baron_dungeon.settings()
		local pids = {party.get_member_pids()}
		
		if party.is_party() then
			for i, pid in next, pids, nil do
				q.begin_other_pc_block(pid)
				pc.remove_item(setting["pass"], 1)
				q.end_other_pc_block()
			end
			d.new_jump_party(setting["baron_dungeon_index"], setting["baron_dungeon_warp"][1], setting["baron_dungeon_warp"][2])
			d.setf("baron_dungeon_level", 1)
			server_timer("baron_dungeon_20min_left", 20*60, d.get_map_index()) -- Zmieniono czas na 20 minut
		else
			pc.remove_item(setting["pass"], 1)
			d.new_jump(setting["baron_dungeon_index"], setting["baron_dungeon_warp"][1]*100, setting["baron_dungeon_warp"][2]*100)
			d.setf("baron_dungeon_level", 1)
			server_timer("baron_dungeon_20min_left", 20*60, d.get_map_index()) -- Zmieniono czas na 20 minut
		end
	end
	
	-----------LOGIN IN DUNGEON [OUT COORDS SETTING]
		when login with baron_dungeon.is_baroned() begin
			local settings = baron_dungeon.settings()
						
			d.set_warp_location(settings["baron_dungeon_index_out"], settings["out_pos"][1], settings["out_pos"][2]);
			if not pc.is_gm() then
				if not pc.in_dungeon() then
					pc.warp(settings["baron_dungeon_index_out"], settings["out_pos"][1]*100, settings["out_pos"][2]*100)
				end
			end
		end


		--DUNGEON ENTER
		when 9257.chat."Kryjówka Baronówny" with not baron_dungeon.is_baroned() begin
			local settings = baron_dungeon.settings()
			say_title(mob_name(9257))
			say("")
			say("Witaj wojowniku!")
			say("Jestem strażnikiem tego oto.")
			say("Świętego Nagrobka")
			say("Nagrobek ten, często jest nawiedzany.")
			say("przez Baronównę pająków.")
			say("Jeśli chcesz, wpuszczę cię tam.")
			say("Tylko nie myśl o tym, by iść samemu.")
			say("Baronówna posiada ogromną moc.")
			wait()
			say("")
			say_title(mob_name(9257))
			say("")
			say("Czy chcesz spróbować?.")
			if (select ("Tak", "Nie") == 1) then
				if baron_dungeon.check_enter() then
					say_reward("Bądź ostrożny, masz tylko 20 minut")
					say_reward("na zabicie Baronówny.")
					say_reward("Następnie, teleportuję cię do siebie.")
					wait()
					baron_dungeon.create_dungeon()
				end
			end
		end
		
		---TIME RESET - ONLY FOR GM
		when 9257.chat."Resetuj Czas" with pc.is_gm() and not baron_dungeon.is_baroned() begin
			addimage(25, 10, "baron_bg_01.tga")
			say("")
			say("")
			say("")
			if select('Resetuj Czas','Zamknij') == 2 then return end
				say("")
				say("")
				say("")
				say_title(mob_name(9257))
				say("")
				say("Czas został zresetowany.")
				pc.setf('baron_dungeon','exit_baron_dungeon_time', 0)
				
				-- Dungeon Info
				pc.setqf("rejoin_time", get_time() - 3600)
		end	
	
		when login with baron_dungeon.is_baroned() begin
			local settings = baron_dungeon.settings()
			
			d.notice("Kryjówka Baronówny: Jest i ona!")
			d.notice(string.format("Kryjówka Baronówny: %s nadchodzi!", mob_name(settings["baron"])))
			d.spawn_mob(settings["baron"], settings["baron_pos"][1], settings["baron_pos"][2])			
		end
	
		when kill with baron_dungeon.is_baroned() and not npc.is_pc() and npc.get_race() == 2092 and d.getf("baron_dungeon_level") == 1 begin
			baron_dungeon.clear_barondungeon()
			d.notice("Kryjówka Baronówny: Pomyślnie przeszedłeś przez Kryjówkę!")
			d.notice("Kryjówka Baronówny: Zostaniesz teleportowany za 2 minuty")
			d.notice("Kryjówka Baronówny: z Kryjówki.")
			server_timer("baron_dungeon_is_done", 115, d.get_map_index())
			d.setf("baron_dungeon_level", 2)
		end

		when baron_dungeon_20min_left.server_timer begin
			if d.select(get_server_timer_arg()) then
				d.notice("Kryjówka Baronówny: 15 minut do końca!!!")
				server_timer("baron_dungeon_10min_left", 5*60, d.get_map_index())
			end
		end
		
		when baron_dungeon_10min_left.server_timer begin
			if d.select(get_server_timer_arg()) then
				d.notice("Kryjówka Baronówny: 10 minut do końca!! Dawaj!")
				server_timer("baron_dungeon_5min_left", 5*60, d.get_map_index())
			end
		end
		
		when baron_dungeon_5min_left.server_timer begin
			if d.select(get_server_timer_arg()) then
				d.notice("Kryjówka Baronówny: 5 minut do końca!! Zegar tyka!!")
				server_timer("baron_dungeon_1min_left", 4*60, d.get_map_index())
			end
		end
		
		when baron_dungeon_1min_left.server_timer begin
			if d.select(get_server_timer_arg()) then
				d.notice("Kryjówka Baronówny: 1 minuta!! Zaraz wszystko przepadnie!")
				server_timer("baron_dungeon_0min_left", 60, d.get_map_index())
			end
		end
		
		when baron_dungeon_0min_left.server_timer begin
			if d.select(get_server_timer_arg()) then
				d.notice("Kryjówka Baronówny: Czas się skończył. Zostajecie wydaleni z kryjówki.")
				server_timer("baron_dungeon_final", 5, d.get_map_index())
			end
		end
		
		when baron_dungeon_final.server_timer begin
			if d.select(get_server_timer_arg()) then								
				d.exit_all()
			end
		end
		
		when logout with baron_dungeon.is_baroned() begin 
			pc.setf("baron_dungeon","exit_baron_dungeon_time", get_global_time())
			pc.setqf("baron_dungeon", get_time() + 3600)
		end
	end
end

 

 

 

Wprowadzone zmiany:

  • Poprawione odwołania do poziomu graczy przy użyciu pid w funkcji check_enter. (sprawdź jak to działa, nie jestem pewny)
  • Doprecyzowanie komunikatów o czekaniu.
  • Poprawione timery, aby odpowiadały rzeczywistym wartościom, w tym czas na 20 minut w lochu.
  • Poprawki w dialogach.
  • Januszek zablokował(a) ten temat
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.