Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Rekomendowane odpowiedzi

Opublikowano

Witam, bawię się ostatnio dużo w lua, ogarniam w miarę większość funkcji do questów i podstawy działania lua, timery itp, lecz cały czas mam problem z funkcjami d.setf, d.setqf
 
Uczę się analizując quest na DT w plikach by terenzo quest dodaję poniżej

 

 

 

 

-- # --------------------------------------------- #
-- #  Questfile from Metin2SF by Ethoard  #
-- # --------------------------------------------- #

quest deviltower_zone begin
	state start begin
		when login begin
			if pc.get_map_index() == 66 then
				if pc.get_x() < 2048+88 or pc.get_y() < 6656+577 or pc.get_x() > 2048+236 or pc.get_y() > 6656+737 then
					pc.warp(590500, 110500)
				end
				pc.set_warp_location(65, 5905, 1105)
			elseif pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 then
				pc.set_warp_location(65, 5905, 1105)
			end
		end
		when deviltower_man.chat.locale.deviltower_man_chat begin
			if pc.get_level() < 40 then
				say_title("Stra¿nik Wie¿y Demonów: ")
				say(locale.deviltower_man_say_you_cant)
			else
				say_title("Stra¿nik Wie¿y Demonów: ")
				say(locale.deviltower_man_say)
				local s = select(locale.deviltower_enter,locale.deviltower_no_enter)
				if s == 1 then
					pc.warp(216500,727000)
				else
					return
				end
			end
		end
		when devil_stone1.kill begin
			timer("devil_stone1_1", 6)
		end
		when devil_stone1_1.timer begin
			local mapto7= pc.count_item(30302)  -- ®ø·À¤£ª¾¬O§_¦s¦bªº¯u¤`ÆF¶ð
			pc.remove_item(30302,mapto7)
			local boxto7= pc.count_item(30300)  -- ®ø·À¤£ª¾¬O§_¦s¦bªº¤£ª¾¦Wªº½c¤l
			pc.remove_item(30300,boxto7)
			d.new_jump_all(66, special.devil_tower[1][1], special.devil_tower[1][2])
			d.regen_file("data/dungeon/deviltower2_regen.txt")
			d.set_warp_at_eliminate(4, d.get_map_index(), special.devil_tower[2][1], special.devil_tower[2][2], "data/dungeon/deviltower3_regen.txt")
		end
		--when devil_stone2.kill begin
		--d.jump_all_local(special.devil_tower[2][1], special.devil_tower[2][2])
		--end
		when devil_stone3.kill begin
			--d.jump_all_local(special.devil_tower[3][1], special.devil_tower[3][2])
			--d.set_exit_all_at_eliminate(6)
			--d.set_warp_at_eliminate(6, d.get_map_index(), 100, 100)
			--d.set_warp_at_eliminate(4, 66, 5376+532, 512+596+4)
			d.set_warp_at_eliminate(4, d.get_map_index(), special.devil_tower[3][1], special.devil_tower[3][2], "data/dungeon/deviltower4_regen.txt")
			d.check_eliminated()
			--d.exit_all()
		end
		function get_4floor_stone_pos()
			local positions = 	{
							{368, 629},
							{419, 630},
							{428, 653},
							{422, 679},
							{395, 689},
							{369, 679},
							{361, 658},
							}
			for i = 1, 6 do
			local j = number(i, 7)
			if i != j then
				local t = positions[i];
				positions[i] = positions[j];
				positions[j] = t;
			end
			end
			--for i = 1, 7 do
		--	positions[i][1] = positions[i][1] * 100
		--	positions[i][2] = positions[i][2] * 100
		 --   end
			return positions
		end
		when 8016.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
			d.setf("level", 4)
			-- ¦A²{¤j¶q©Çª«¤Î»s³y¯u¥ÛÀY©M°²¥ÛÀY
			--d.regen_file("data/dungeon/deviltower4_regen.txt")
			local positions = deviltower_zone.get_4floor_stone_pos()
			for i = 1, 6 do
			chat(positions[i][1], positions[i][2])
			d.set_unique("fake" .. i , d.spawn_mob(8017, positions[i][1], positions[i][2]))
			end
			chat(positions[7][1], positions[7][2])
			local vid = d.spawn_mob(8017, positions[7][1], positions[7][2])
			chat(vid)
			d.set_unique("real", vid)
			server_loop_timer('devil_stone4_update', 10, pc.get_map_index())
			server_timer('devil_stone4_fail1', 5*60, pc.get_map_index())
			d.notice("Dotar³eœ do Bramy Wyboru na 3. piêtrze. Wiele");
			d.notice("kamieni Metin bêdzie dra¿niæ Twoje oczy i uszy.");
			d.notice("ZnajdŸ w³aœciwy kamieñ Metin i zniszcz go w");
			d.notice("ci¹gu 15 minut! To jedyny sposób aby przejœæ ");
			d.notice("dalej.");
		end
		when devil_stone4_fail1.server_timer begin
			if d.select(get_server_timer_arg()) then
			d.notice("Pozosta³o 10 minut!")
			server_timer('devil_stone4_fail2', 5*60, get_server_timer_arg())
			end
		end
		when devil_stone4_fail2.server_timer begin
			if d.select(get_server_timer_arg()) then
			d.notice("Pozosta³o 5 minut!")
			server_timer('devil_stone4_fail', 5*60, get_server_timer_arg())
			end
		end
		when devil_stone4_fail.server_timer begin
			if d.select(get_server_timer_arg()) then
			d.notice("Nie uda³o siê, zostaniecie wylogowany!")
			d.exit_all()
			clear_server_timer('devil_stone4_update', get_server_timer_arg())
			end
		end
		when devil_stone4_update.server_timer begin
			if d.select(get_server_timer_arg()) then
			if not d.is_unique_dead("real") then
				for i = 1, 6 do
				if d.getf("fakedead" .. i) == 0 then
					if d.unique_get_hp_perc("fake" .. i) < 50 then
					d.purge_unique("fake" .. i)
					d.setf("fakedead" .. i, 1)
					d.notice("To nie ten kamieñ!");
					end
				end
				end
			else
				--d.clear_regen()
				--d.regen_file("data/dungeon/deviltower5_regen.txt")
				server_timer("devil_stone4_end", 5, get_server_timer_arg())
				d.notice("Wykaza³eœ siê doskona³ym s³uchem i instynktem");
				d.notice("Zniszczy³eœ prawid³owy kamieñ Metin! Za chwilê ")
				d.notice("dotrzesz na 4. pietro!")
				clear_server_timer('devil_stone4_fail1', get_server_timer_arg())
				clear_server_timer('devil_stone4_fail2', get_server_timer_arg())
				clear_server_timer('devil_stone4_fail', get_server_timer_arg())
			end
			else
			server_timer('devil_stone4_stop_timer', 1, get_server_timer_arg())
			end
		end
		when devil_stone4_stop_timer.server_timer begin
			clear_server_timer('devil_stone4_update', get_server_timer_arg())
		end
		when devil_stone4_end.server_timer begin
			if d.select(get_server_timer_arg()) then
			d.setf("level", 5)
			d.setf("stone_count", 5)
			d.notice("Dotar³eœ do zamkniêtej Bramy na 4. piêtrze!")
			d.notice("Znajduje siê tu wiele potworów, które strzeg¹ ")
			d.notice("tajemniczych kamieni - bêdziesz ich potrzebowa³. ")
			d.notice("Bez nich nie dostaniesz siê na 5. poziom Wie¿y. ")
			d.notice("Zdob¹dŸ Kamienie od potworów i u¿yj ich, aby")
			d.notice("odblokowaæ Staro¿ytne Pieczêci. Na wykonanie")
			d.notice("tego zadania masz tylko 20 minut - spiesz siê! ")
			d.jump_all(special.devil_tower[4][1], special.devil_tower[4][2])
			server_timer('devil_stone5_fail1', 5*60, get_server_timer_arg())
			clear_server_timer('devil_stone4_update', get_server_timer_arg())
			-- 5¼ÓÄ~Äò¦A²{
			d.set_regen_file("data/dungeon/deviltower5_regen.txt")
			-- 5¼Ó«Ê¦L¥Û¦A²{
			d.spawn_mob(20073, 421, 452)
			d.spawn_mob(20073, 380, 460)
			d.spawn_mob(20073, 428, 414)
			d.spawn_mob(20073, 398, 392)
			d.spawn_mob(20073, 359, 426)
			end
		end
		when devil_stone5_fail1.server_timer begin
			if d.select(get_server_timer_arg()) then
			d.notice("Pozosta³o 15 minut!")
			server_timer('devil_stone5_fail2', 5*60, get_server_timer_arg())
			end
		end
		when devil_stone5_fail2.server_timer begin
			if d.select(get_server_timer_arg()) then
			d.notice("Pozosta³o 10 minut!")
			server_timer('devil_stone5_fail3', 5*60, get_server_timer_arg())
			end
		end
		when devil_stone5_fail3.server_timer begin
			if d.select(get_server_timer_arg()) then
			d.notice("Pozosta³o 5 minut!")
			server_timer('devil_stone5_fail', 5*60, get_server_timer_arg())
			end
		end
		when devil_stone5_fail.server_timer begin
			if d.select(get_server_timer_arg()) then
			d.notice("Nie uda³o siê, zostaniesz wylogowany!")
			d.exit_all()
			end
		end
		--when devil_stone4.kill begin
			--d.setf("level", 5)
			--d.setf("stone_count", 4)
			--d.clear_regen()
			--d.regen_file("data/dungeon/deviltower5_regen.txt")
			--d.jump_all_local(special.devil_tower[4][1], special.devil_tower[4][2])
		--end
		when 1062.kill with pc.in_dungeon() and d.getf("level") == 5 begin
			local KILL_COUNT_FOR_DROP_KEY = 50
			--if is_test_server() then
			--KILL_COUNT_FOR_DROP_KEY = 1
			--end
			local n =d.getf("count") + 1
			d.setf("count", n)
			if n == KILL_COUNT_FOR_DROP_KEY then
			-- ±¼¤UÂê°Í
			game.drop_item(50084, 1)
			d.setf("count", 0)
			end
		end
		when devil_stone5.take with item.vnum == 50084 begin
			npc.purge()
			item.remove()
			d.setf("stone_count", d.getf("stone_count") - 1)
			if d.getf("stone_count") <= 0 then
			d.setf("level", 6)
			d.clear_regen()
			d.regen_file("data/dungeon/deviltower6_regen.txt")
			d.notice("Wszystkie Staro¿ytne Pieczêci zosta³y otwarte.")
			d.notice("Teraz dotrzesz na 5. poziom Wie¿y Demonów. ")
			d.notice("Zabij wszystkie potwory na 5. piêtrze, jednak ")
			d.notice("uwa¿aj Piêtro to nale¿y do Króla Demonów! ")
			d.jump_all(special.devil_tower[5][1], special.devil_tower[5][2])
			clear_server_timer('devil_stone5_fail1', get_server_timer_arg())
			clear_server_timer('devil_stone5_fail2', get_server_timer_arg())
			clear_server_timer('devil_stone5_fail3', get_server_timer_arg())
			clear_server_timer('devil_stone5_fail', get_server_timer_arg())
			else
			d.notice("Otworzy³eœ pieczêæ! Pozosta³o jeszcze: "..d.getf("stone_count").."!")
			end
		end
		when devil_stone6.kill begin
			-- ¶Ç°e¨ì·Ò¸t©Ò¦bªº¦a¹Ï
			-- §_«h¡A¶}³]¤@­Ó·s·Ò¸t
			--d.jump_all(special.devil_tower[6][1], special.devil_tower[6][2])
			d.kill_all()
		   -- d.set_warp_at_eliminate(3*60, 66, 5376+532, 512+596+4)
			d.check_eliminated()
			local reward_alchemist = {20074, 20075, 20076}
			d.spawn_mob(reward_alchemist[number(1,3)], 425, 216);
			d.setqf("can_refine", 1)
		end
		--------------------------------------
		-- ¥Ñ¶i¤J7¼Ó¦Ü¨ì¹F8¼Ó¤§«e
		--------------------------------------
		when 20074.chat."Wy¿sze piêtro" with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
			say_title("Zbrojmistrz Wie¿y Demonów ")
			say("Co?! Chcesz udaæ siê na 6. poziom Wie¿y? ")
			say("Wyprawa na wy¿sze poziomy wymaga")
			say("naprawdê dobrego przygotowania.")
			say("Je¿eli osi¹gn¹³eœ 75. poziom mogê ")
			say("przenieœæ Ciê na wy¿sze piêtro.")
			wait()
			if pc.level >=75 then
			say_title("Zbrojmistrz Wie¿y Demonów ")
				say("Masz odpowiedni poziom i dlatego masz spore ")
				say("szanse na przetrwanie na wy¿szych piêtrach.")
				say("Mozesz wejϾ")
				timer("devil_jump_7", 6)
				return
			end
			say("Mo¿esz przejsc dalej!")
			say("")
			say("")
			wait()
			pc.warp(590500, 110500)
			return
		end
		when 20075.chat."Wy¿sze piêtro" with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
			say_title("Platnerz Wie¿y Demonów ")
			say("Co?! Chcesz udaæ siê na 6. poziom Wie¿y? ")
			say("Wyprawa na wy¿sze poziomy wymaga")
			say("naprawdê dobrego przygotowania.")
			say("Je¿eli osi¹gn¹³eœ 75. poziom mogê ")
			say("przenieœæ Ciê na wy¿sze piêtro.")
			wait()
			if pc.level >=75 then
			say_title("Platnerz Wie¿y Demonów ")
				say("Masz odpowiedni poziom i dlatego masz spore ")
				say("szanse na przetrwanie na wy¿szych piêtrach.")
				say("Mozesz wejϾ")
				timer("devil_jump_7", 6)
				return
			end
			say("Mo¿esz przejsc dalej!")
			say("")
			say("")
			wait()
			pc.warp(590500, 110500)
			return
		end
		when 20076.chat."Wy¿sze piêtro" with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
			say_title("Jubiler Wie¿y Demonów ")
			say("Co?! Chcesz udaæ siê na 6. poziom Wie¿y? ")
			say("Wyprawa na wy¿sze poziomy wymaga")
			say("naprawdê dobrego przygotowania.")
			say("Je¿eli osi¹gn¹³eœ 75. poziom mogê ")
			say("przenieœæ Ciê na wy¿sze piêtro.")
			wait()
			if pc.level >=75 then
			say_title("Jubiler Wie¿y Demonów ")
				say("Masz odpowiedni poziom i dlatego masz spore ")
				say("szanse na przetrwanie na wy¿szych piêtrach.")
				say("Mozesz wejϾ")
				timer("devil_jump_7", 6)
				return
			end
			say("Mo¿esz przejsc dalej!")
			say("")
			say("")
			wait()
			pc.warp(590500, 110500)
			return
		end
		when devil_jump_7.timer begin
			d.notice("Mapa Zin-Sa-Gui otwiera drogê na nastêpne")
			d.notice("piêtro. Zniszcz kamienie Metin, aby j¹ odnaleŸæ ")
			d.clear_regen()
			d.spawn_mob(8018, 639, 658)
			d.spawn_mob(8018, 611, 637)
			d.spawn_mob(8018, 596, 674)
			d.spawn_mob(8018, 629, 670)
			d.setf("level", 7)
			d.jump_all(2048+590, 6656+638)
		end
		when 8018.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
			local cont = d.getf("7_stone_kill") + 1
			d.setf("7_stone_kill", cont)
			if cont >= 4 then
				d.setf("7_stone_kill", 0)
				d.set_regen_file("data/dungeon/deviltower7_regen.txt")
			end
		end
		when 8019.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
			game.drop_item(30300, 1)
		end
		when 30300.use with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
			pc.remove_item("30300", 1)
			local pct = number(1,10)
			if pct == 1 then
				-- ±¼¤U¯u¦a¹Ï
				game.drop_item(30302, 1)
				d.clear_regen()
			else
				-- ±¼¤U°²¦a¹Ï
				game.drop_item(30301, 1)
			end
		end
		when 30302.use with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
			-- ¶Ç°e¨ì8¼Ó
							say_title("Informacja:")
			say("Ta mapa przeniesie Ciê na 8 . poziom Wie¿y ")
			say("Demonów.")
			pc.remove_item("30302", 1)
			timer("devil_jump_8", 6)
			d.clear_regen()
		end
		--------------------------------------------
		-- ¥Ñ¶i¤J8¼Ó¦Ü¨ì¹F9¼Ó¤§«e
		--------------------------------------------
		when devil_jump_8.timer begin
			d.notice("ZnajdŸ odpowiedni klucz!")
			d.notice("Potrzebujesz klucza Zin-Bong-In aby")
			d.notice("móc otworzyæ pieczêæ Sa-Soein i dostaæ ")
			d.notice("siê na nastêpne piêtro Wie¿y.")
			d.setf("level", 8)
			d.jump_all(2048+590, 6656+403)
			d.set_regen_file("data/dungeon/deviltower8_regen.txt")
			d.spawn_mob(20366, 640, 460)
			local _count= pc.count_item(30302)-- ®ø·À¯u¤`ÆF¶ð
			pc.remove_item(30302,_count)
		end
		when 1040.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
			local pct1 = number(1, 5)
			if pct1 == 1 then
				local pct2 = number(1, 10)
				if pct2 == 1 then
					-- ±¼¤U¯uÂê°Í
					game.drop_item(30304, 1)
				else
					-- ±¼¤U°²Âê°Í
					game.drop_item(30303, 1)
				end
			else
				return
			end
		end
		when 20366.take with item.vnum == 30304 begin
			-- 9¼Ó«Ê¦L¸Ñ°£
			npc.purge()
			item.remove()
			timer("devil_jump_9", 6)
		end
		---------------------------------------------
		-- ¥Ñ¶i¤J9¼Ó¦Üµ²§ô
		---------------------------------------------
		when devil_jump_9.timer begin
			d.notice("Zabij Przywódcê Demonów! ")
			d.setf("level", 9)
			d.jump_all(2048+590, 6656+155)
			d.clear_regen()
			d.regen_file("data/dungeon/deviltower9_regen.txt")
		end
		when 1093.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
			d.kill_all()
			timer("devil_end_jump", 60)
		end
		when devil_end_jump.timer begin
			d.exit_all()
		end
	end
end

 

 

 

 

 

Proszę tylko o czysto teoretyczne objaśnienie funkcji w tym queście głównie chodzi mi o d.setf, ale również o d.setqf i d.set_unique i inne podobne jak d.select, do czego są, jak działają i jak ich najlepiej używać. Jak googlowałem to znalazłem opisy w stylu
d.setf = ustawia wartość pliku podręcznego o podanej nazwie na podaną wartość liczbową, np. d.setqf("wartosc", 1) :)

d.setqf = ustawia plik podręczny dla podanej wyprawy o podanej wartości

d.select = ustawia index mapy dungeonowej jako aktywna dla dalszego działania questa

Jak używać tego w praktyce ? daję ++ :)

Opublikowano

d.setf = dungeon.setFlag, jest to proste ustawienie wartości zmiennej przechowywanej w DB dla wszystkich graczy dungeona. Każdy gracz może się do niej odwołać i sprawdzić jej wartość. (oczywiście gracze odwołują się nieświadomie, operuje tym quest). Zaletą tego typu zapisywania danych jest to, że po zamknięciu dungeona wszystkie flagi są usuwane.

 

Przykład zliczania mobów 

when kill with pc.in_dungeon() begin
local count = d.getf("kill")+1
d.setf("kill",count)
end
I teraz tą zmienną można wysłać do jakiś statystyk w panelu gracza.

 

Lub przykładowy drop po wybici 50 mobów na 10 piętrze dungeonu. 

when kill with pc.in_dungeon() and d.getf("level") == 10 begin -- jak widać, wcześniej musimy sobie zapisywać level przy każdym piętrze
local count = d.getf("10thFloorCount") +1
d.setf("10thFloorCount",count)
if count == 50 then
pc.give_item2(1234,1)
d.notice("Udało się, zdobyliście klucz przejścia. Użyjcie go aby przedostać się dalej.")

when 1234.use with pc.in_dungeon() and d.getf("level") == 10 begin
item.remove()
d.setf("level",11) -- ustawiamy kolejny level wyprawy
d.new_jump_all(55555+243,55555+444) -- tp na kordy 243,444 + globalne kordy 
end
d.setqf - chyba nawet takiej funkcji nie ma

d.select() to wolę używać pc.get_map_index() to samo, ale wiem, że ten d.select() trzeba było go chyba najpierw ustawić, ogólnie po co kombinować jak jest pc.get_map_index() i tym odpalasz np. serwer_timer.

50596142255057180250.png

Opublikowano

@Nigahiga

 

Spróbuj użyć pc.get_map_index() w dungeonie i zobacz co Ci zwróci.

Jak już to d.get_map_index()

 

 

 

when kill with pc.in_dungeon() begin
local count = d.getf("kill")+1
pc.setf("kill",count)
end

 

Błąd, popraw bo kolega później będzie zdziwiony czemu mu nie działa.




 





I'm here for You, not for myself

Always help You


 

Opublikowano

@Nigahiga

 

Spróbuj użyć pc.get_map_index() w dungeonie i zobacz co Ci zwróci.

Jak już to d.get_map_index()

Zależy w jakiej sytuacji, jeżeli opieramy się na graczu, a tak zazwyczaj jest to można używać. Jeżeli leci sam timer, to nawet zwykłe notice opierające się na graczu wyrzuci serwer, brak wszystkich argumentów.

50596142255057180250.png

Opublikowano

@Nigahiga

 

Wystarczyło mi że poprzez funkcję wypisywania tekstu na czacie nie zwrócił mi nic.

Wolę używać tej drugiej :)




 





I'm here for You, not for myself

Always help You


 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...