|
You last visited: Today at 16:01
Advertisement
[SERVICE] Die Questkontrolle
Discussion on [SERVICE] Die Questkontrolle within the Metin2 Private Server forum part of the Metin2 category.
07/25/2016, 16:56
|
#12391
|
elite*gold: 0
Join Date: Jul 2016
Posts: 14
Received Thanks: 12
|
Quote:
Originally Posted by TrollZone
Hallo!
Ich bekomme durchgehend:
Error occured on compile ...
|
Man sieht im Php Code doch schon, dass da ein " zu viel ist.
Code:
quest ingameban begin
state start begin
when login with pc.is_gm() begin
send_letter("HALLO")
end
when button or info with pc.is_gm() begin
say_title("Sharzun - BannPanel")
say("Hier kannst du folgende Dinge tun:")
say("")
say("- Einen Spieler Bannen")
say("- Einen Spieler Entbannen")
say("")
local a = select("Ban Player", "Unban player", "Exit")
if a == 1 then
say("Name of player who you wanna ban")
say("")
say("Info : Abusing GM power and you will be removed")
local cblock = input()
say("Reason:")
local creason = input()
game.set_event_flag("banned_".. cblock ..(),1)
notice_all("Player: ".. cblock .." is banned. reason: ".. creason.."")
notice_all("<ATTENTION>Play by the rules!!")
end
if a == 2 then
say("Insert name of player who will be unbanned")
local cublock = input()
game.set_event_flag("banned_".. culock ..(),0)
notice_all("Ban for player: ".. cublock .." was removed")
end
if a == 3 then
return
end
end
end
end
|
|
|
08/05/2016, 16:05
|
#12392
|
elite*gold: 50
Join Date: Jan 2013
Posts: 805
Received Thanks: 335
|
Hi undzwar hier an die Quester.
Ich beschäftige mich derzeit mit questen und möchte meine eigene Spinnenbaroness Quest schreiben.
Ich habe bisher geschafft das man Den Schlüssel abgeben muss und dann rein kommt und nach dem killen wieder Map1 geportet wird.
Und falls kein Schlüssel vorhanden ist man keinen Eintritt erhält.
Code:
quest spinnenbaroness begin
state start begin
when 30130.chat."Zugang zur Bruthöhle" begin
if pc.count_item("30324") < 1 then
say("Dieses Tor lässt sich nur mit einem")
say("Arachnidenschlüssel öffnen.")
elseif pc.count_item("30324") >= 1 then
say("Du wirst nun teleportiert.")
say("Viel Erfolg!")
d.new_jump(217, 88100, 614900)
d.regen_file("locale/germany/map/metin2_map_spinnendungeon_03/regen.txt")
end
end
when 2092.kill begin
timer("bosskill", 10)
syschat("Ihr werdet nun in eure Heimatstadt teleportiert.")
end
when bosskill.timer begin
d.exit_all_to_start_position()
end
end
end
Ich wollte das man auch alleine ohne Gruppe rein kommt. Das funktioniert. Wenn man jetzt aber in der Gruppe ist wird dann die ganze Gruppe teleportiert ?
Als zweites wollte ich fragen wie ich das mache. Wenn jetzt gerade eine Gruppe oder jemand einzelnes drinnen ist, ist es ja nicht gesperrt.
Wie kann ich das einfügen das, dann das Grabmal sagt: Der Dungeon ist gerade besetzt. Probiere es gleich noch einmal.
Was auch noch schön wäre ist das im Rufchat steht wer den Boss getötet hat.
Vielen Dank schonmal im Vorraus.
|
|
|
08/07/2016, 23:51
|
#12393
|
elite*gold: 1810
Join Date: Jan 2012
Posts: 2,180
Received Thanks: 1,617
|
Quote:
Originally Posted by #Vendetta
Hi undzwar hier an die Quester.
Ich beschäftige mich derzeit mit questen und möchte meine eigene Spinnenbaroness Quest schreiben.
Ich habe bisher geschafft das man Den Schlüssel abgeben muss und dann rein kommt und nach dem killen wieder Map1 geportet wird.
Und falls kein Schlüssel vorhanden ist man keinen Eintritt erhält.
Code:
quest spinnenbaroness begin
state start begin
when 30130.chat."Zugang zur Bruthöhle" begin
if pc.count_item("30324") < 1 then
say("Dieses Tor lässt sich nur mit einem")
say("Arachnidenschlüssel öffnen.")
elseif pc.count_item("30324") >= 1 then
say("Du wirst nun teleportiert.")
say("Viel Erfolg!")
d.new_jump(217, 88100, 614900)
d.regen_file("locale/germany/map/metin2_map_spinnendungeon_03/regen.txt")
end
end
when 2092.kill begin
timer("bosskill", 10)
syschat("Ihr werdet nun in eure Heimatstadt teleportiert.")
end
when bosskill.timer begin
d.exit_all_to_start_position()
end
end
end
Ich wollte das man auch alleine ohne Gruppe rein kommt. Das funktioniert. Wenn man jetzt aber in der Gruppe ist wird dann die ganze Gruppe teleportiert ?
Als zweites wollte ich fragen wie ich das mache. Wenn jetzt gerade eine Gruppe oder jemand einzelnes drinnen ist, ist es ja nicht gesperrt.
Wie kann ich das einfügen das, dann das Grabmal sagt: Der Dungeon ist gerade besetzt. Probiere es gleich noch einmal.
Was auch noch schön wäre ist das im Rufchat steht wer den Boss getötet hat.
Vielen Dank schonmal im Vorraus.
|
1. anderer questbefehl zum jumpen (entweder oder)
2. durch eine Abfrage (event_flag)
|
|
|
08/10/2016, 00:39
|
#12394
|
elite*gold: 0
Join Date: May 2012
Posts: 12
Received Thanks: 0
|
Kann mir jemand sagen warum diese Quest nicht funktioniert?
Wenn ich auf den Alkoholkrug klicke startet die Quest nicht mal, dass konnte ich herausfinden indem ich noch "chat("Test test Test")" hinzugefügt habe. Alle anderen Quests funktionieren einwandfrei.
Code:
quest alkoholkrug begin
state start begin
when 30013.use begin
chat("Test test Test")
pc.give_exp2(pc.get_next_exp())
end
end
end
|
|
|
08/10/2016, 02:25
|
#12395
|
elite*gold: 399
Join Date: Sep 2011
Posts: 5,323
Received Thanks: 3,938
|
Quote:
Originally Posted by ahmedta
Kann mir jemand sagen warum diese Quest nicht funktioniert?
Wenn ich auf den Alkoholkrug klicke startet die Quest nicht mal, dass konnte ich herausfinden indem ich noch "chat("Test test Test")" hinzugefügt habe. Alle anderen Quests funktionieren einwandfrei.
Code:
quest alkoholkrug begin
state start begin
when 30013.use begin
chat("Test test Test")
pc.give_exp2(pc.get_next_exp())
end
end
end
|
Item Type auf 18 bzw ITEM_QUEST stellen, überprüfen, ob die Quest in die locale_list eingetragen ist und ggf. den Server nach dem Quest "compilen" restarten.
|
|
|
08/23/2016, 15:48
|
#12396
|
elite*gold: 9
Join Date: Jun 2012
Posts: 268
Received Thanks: 155
|
PHP Code:
state ebene1_begin begin when letter begin local v=find_npc_by_vnum(20383) d.setf("ebene5_begin", 1) if v != 0 then target.vid("__TARGET__", v, "Aneko") end end when 20383.click with d.getf("ebene5_begin") == 1 begin target.delete("__TARGET__") say("Du bist weit gekommen "..pc.get_name()..". ") d.setf("ebene5_begin", 0) timer("upp5s", 2) end when upp5s.timer begin chat("Du hast noch 5 Sekunden Zeit, deine Ausrüstung beim Schmied zu verbessern") timer("ebene5_spawn1", 1) end when ebene5_spawn1.timer begin d.jump_all(1111+60, 1111+240) d.spawn_mob(391, 38, 255) d.spawn_mob(392, 38, 252) d.setf("anzahl", d.count_monster()) d.setf("spawn1", 1) end when kill with d.getf("spawn1") == 1 begin d.setf("anzahl", d.getf("anzahl")-1) if d.getf("anzahl") <= 0 then d.setf("spawn1", 0) chat("Du hast sie beide getötet!") d.spawn_mob(393, 38, 241) d.spawn_mob(394, 38, 237) timer("ebene5_spawn2", 1) end end when ebene5_spawn2.timer begin d.setf("anzahl1", d.count_monster()) d.setf("spawn2", 1) end when kill with d.getf("spawn2") == 1 begin d.setf("anzahl1", d.getf("anzahl1")-1) if d.getf("anzahl1") <= 0 then d.setf("spawn2", 0) chat("Du hast sie beide getötet!") d.spawn_mob(392, 38, 227) d.spawn_mob(394, 38, 223) timer("ebene5_spawn3", 1) end end when ebene5_spawn3.timer begin d.setf("anzahl2", d.count_monster()) d.setf("spawn3", 1) end when kill with d.getf("spawn3") == 1 begin d.setf("anzahl2", d.getf("anzahl2")-1) if d.getf("anzahl2") <= 0 then d.setf("spawn3", 0) chat("Du hast sie beide getötet!") set_state(ebene6) end end end
Das Problem: Spawn1 der 2 Monster ist erfolgreich mit dem Chattext nach dem töten. Wenn Spawn2 der 2 Monster erscheint und ich die töte, erscheint der chat-text nicht mehr und der 3te Spawn erscheint nicht.
Ist nur ein Abschnitt von der Quest, da es ein einzelner State ist der nicht funktioniert - der restliche schon.
P.S.: Ich habe lange nicht mehr mit quests gearbeitet, bitte nicht so bös sein wegen Fehler
|
|
|
08/23/2016, 17:22
|
#12397
|
elite*gold: 0
Join Date: Aug 2016
Posts: 192
Received Thanks: 16
|
Quote:
Originally Posted by ahmedta
Kann mir jemand sagen warum diese Quest nicht funktioniert?
Wenn ich auf den Alkoholkrug klicke startet die Quest nicht mal, dass konnte ich herausfinden indem ich noch "chat("Test test Test")" hinzugefügt habe. Alle anderen Quests funktionieren einwandfrei.
Code:
quest alkoholkrug begin
state start begin
when 30013.use begin
chat("Test test Test")
pc.give_exp2(pc.get_next_exp())
end
end
end
|
- In der Datenbank den Type auf 18 stellen.
- Die Quest in die locale/quest_list eintragen.
- ingame /reload q & die Quests in Putty/Virtual Box reloaden.
Mit freundlichen Grüßen.
|
|
|
09/01/2016, 13:55
|
#12398
|
elite*gold: 0
Join Date: Jan 2009
Posts: 21
Received Thanks: 3
|
PHP Code:
quest warpring begin state start begin when 70007.use begin local warp = {--koord Pflicht, rest optional! {--Map1 name = "[01-20] Map 1", {--Rotes Reich name = "[01-20] Rotes Reich", koord = {474100, 955000}, }, {--Gelbes Reich name = "[01-20] Gelbes Reich", koord = {63525, 166543}, }, {--Blaues Reich name = "[01-20] Blaues Reich", koord = {960100, 268800}, } }, {--Map2 name = "[20-35] Map 2", {--Rotes Reich name = "[20-35] Rotes Reich", koord = {352200, 882200}, }, {--Gelbes Reich name = "[20-35] Gelbes Reich", koord = {145900, 239800}, }, {--Blaues Reich name = "[20-35] Blaues Reich", koord = {863700, 246300}, } }, {--Standart Maps name = "[35-55] Standart Maps", {--Orktal Mitte name = "[35-55] Orktal", koord = {333074, 747167}, }, {--Hwang-Tempel name = "[35-55] Tempel", koord = {553600, 144100}, }, {--Wüste Mitte name = "[35-55] Wüste", koord = {297300, 547900}, }, {--Eisland Mitte name = "[35-55] Eisland", koord = {436900, 216100}, }, {--Feuerland Mitte name = "[35-55] Feuerland", koord = {601300, 687900}, }, {--Dämonenturm name = "[35-55] Dämonenturm", koord = {590406, 110717}, }, {--Schlangenfeld name = "[35-55] Schlangenfeld", koord = {1059000, 726200}, } }, {--Spinnendungeons name = "[55-75] Anspruchsvolle Maps", {--Spinnendungeons 1 name = "[55-65] Spinnendungeon 1", koord = {60000, 497000}, }, {--Spinnendungeons 2 name = "[65-75] Spinnendungeon 2", koord = {703800, 462500}, } }, {--Grotte der Verbannung name = "[150-200] Besondere Maps", {--Grotte 1 name = "[150-200] Grotte(FP)", koord = {10000, 1207800}, }, {--Grotte 2 name = "[150-200] Grotte (SP)", koord = {241800, 1275000}, }, {--Drachenraum name = "[200-Dungeon] Drachenraum", koord = {181473, 1220674}, } }, {--90er Maps name = "[55-120] Farmmaps", {--Donnerberge name = "[55-89] Donnerberge", koord = {1134500, 1654600}, }, {--Gautamakliff name = "[90-120] Gautamakliff", koord = {1226300, 1681100}, } }, {--100er Maps name = "[90-200] Levelmaps", {--Rotdrachen-Festung name = "[90-100] Rotdrachen-Festung", koord = {614265, 706964}, }, {--Nemeres Warte name = "[100-125] Nemeres Warte", koord = {433025, 167605}, }, {--Verwunschener Wald name = "[125-140] Verwunschener Wald", koord = {801800, 1499000}, }, {--Tempel der Ochao name = "[140-160]Tempel der Ochao", koord = {884800, 1447000}, }, {--Kap des Drachenfeuers name = "[160-190] Drachenkap", koord = {1104300, 1788500}, }, {--Nephritbucht name = "[190-200] Nephritbucht", koord = {1086900, 1655800}, } } } warpring.showwarps(warp) end function warp(tbl) local level = pc.get_level() if tbl.minlevel and level < tbl.minlevel then say("Dein Level ist zu niedrig, um diese Map zu betreten.") say("Minimal Level: "..tbl.minlevel) select("Abbrechen") return elseif tbl.maxlevel and level > tbl.maxlevel then say("Dein Level ist zu hoch, um diese Map zu betreten.") say("Maximal Level: "..tbl.maxlevel) select("Abbrechen") return end while not pc.can_warp() do say("Du kannst dich noch nicht teleportieren, da du in") say("den letzten 10 Sekunden gehandelt hast.") if select("Erneut versuchen", "Abbrechen") == 2 then return end end local warpneedstrings = warpring.get_warpneedstrings(tbl) if table.getn(warpneedstrings) > 0 then say("Um diese Map zu betreten benötigst du folgende") say("Dinge:") for _,v in ipairs(warpneedstrings) do say(v) end say("") say("Möchtest du trotzdem fortfahren?") if select("Teleportieren", "Abbrechen") == 2 then return end end if not warpring.check_and_remove_warpneeds(tbl) then say("Dir fehlt mindestens eins der benötigten Dinge.") select("Abbrechen") return end pc.warp(tbl.koord[1], tbl.koord[2]) end function get_warpneedstrings(tbl) local warpneeds = {} if tbl.itemneed and table.getn(tbl.itemneed) > 0 then for _,v in ipairs(tbl.itemneed) do table.insert(warpneeds, "- "..v[2].."x "..item_name(v[1])) end end if tbl.goldneed and tbl.goldneed > 0 then table.insert(warpneeds, "- "..tbl.goldneed.." Yang") end return warpneeds end function check_warpneeds(tbl) if tbl.itemneed and table.getn(tbl.itemneed) > 0 then for _,v in ipairs(tbl.itemneed) do if pc.count_item(v[1]) < v[2] then return false end end end if tbl.goldneed and tbl.goldneed > 0 then if pc.get_gold() < tbl.goldneed then return false end end return true end function remove_warpneeds(tbl) if tbl.itemneed and table.getn(tbl.itemneed) > 0 then for _,v in ipairs(tbl.itemneed) do pc.remove_item(v[1], v[2]) end end if tbl.goldneed and tbl.goldneed > 0 then pc.change_gold(-tbl.goldneed) end end function check_and_remove_warpneeds(tbl) if not warpring.check_warpneeds(tbl) then return false end warpring.remove_warpneeds(tbl) return true end function get_warpnames(tbl) local level = pc.get_level() local names = {} for _,v in ipairs(tbl) do if v.minlevel and level < v.minlevel then v.name = v.name.." (ab Lv. "..v.minlevel..")" elseif v.maxlevel and level > v.maxlevel then v.name = v.name.." (bis Lv. "..v.maxlevel..")" end table.insert(names, v.name) end return names end function showwarps(tbl) local warpnames = warpring.get_warpnames(tbl) local s = tbl[select3(warpnames)] or false if not s then return end if s.koord then warpring.warp(s) return end warpring.showwarps(s) end end end
kriege folgenden fehler :
Calls undeclared function !:
ipairs
select3
Error occured on compile warp_ring.quest
|
|
|
09/01/2016, 14:55
|
#12399
|
elite*gold: 0
Join Date: Aug 2016
Posts: 192
Received Thanks: 16
|
Quote:
Originally Posted by nickyo
PHP Code:
quest warpring begin state start begin when 70007.use begin local warp = {--koord Pflicht, rest optional! {--Map1 name = "[01-20] Map 1", {--Rotes Reich name = "[01-20] Rotes Reich", koord = {474100, 955000}, }, {--Gelbes Reich name = "[01-20] Gelbes Reich", koord = {63525, 166543}, }, {--Blaues Reich name = "[01-20] Blaues Reich", koord = {960100, 268800}, } }, {--Map2 name = "[20-35] Map 2", {--Rotes Reich name = "[20-35] Rotes Reich", koord = {352200, 882200}, }, {--Gelbes Reich name = "[20-35] Gelbes Reich", koord = {145900, 239800}, }, {--Blaues Reich name = "[20-35] Blaues Reich", koord = {863700, 246300}, } }, {--Standart Maps name = "[35-55] Standart Maps", {--Orktal Mitte name = "[35-55] Orktal", koord = {333074, 747167}, }, {--Hwang-Tempel name = "[35-55] Tempel", koord = {553600, 144100}, }, {--Wüste Mitte name = "[35-55] Wüste", koord = {297300, 547900}, }, {--Eisland Mitte name = "[35-55] Eisland", koord = {436900, 216100}, }, {--Feuerland Mitte name = "[35-55] Feuerland", koord = {601300, 687900}, }, {--Dämonenturm name = "[35-55] Dämonenturm", koord = {590406, 110717}, }, {--Schlangenfeld name = "[35-55] Schlangenfeld", koord = {1059000, 726200}, } }, {--Spinnendungeons name = "[55-75] Anspruchsvolle Maps", {--Spinnendungeons 1 name = "[55-65] Spinnendungeon 1", koord = {60000, 497000}, }, {--Spinnendungeons 2 name = "[65-75] Spinnendungeon 2", koord = {703800, 462500}, } }, {--Grotte der Verbannung name = "[150-200] Besondere Maps", {--Grotte 1 name = "[150-200] Grotte(FP)", koord = {10000, 1207800}, }, {--Grotte 2 name = "[150-200] Grotte (SP)", koord = {241800, 1275000}, }, {--Drachenraum name = "[200-Dungeon] Drachenraum", koord = {181473, 1220674}, } }, {--90er Maps name = "[55-120] Farmmaps", {--Donnerberge name = "[55-89] Donnerberge", koord = {1134500, 1654600}, }, {--Gautamakliff name = "[90-120] Gautamakliff", koord = {1226300, 1681100}, } }, {--100er Maps name = "[90-200] Levelmaps", {--Rotdrachen-Festung name = "[90-100] Rotdrachen-Festung", koord = {614265, 706964}, }, {--Nemeres Warte name = "[100-125] Nemeres Warte", koord = {433025, 167605}, }, {--Verwunschener Wald name = "[125-140] Verwunschener Wald", koord = {801800, 1499000}, }, {--Tempel der Ochao name = "[140-160]Tempel der Ochao", koord = {884800, 1447000}, }, {--Kap des Drachenfeuers name = "[160-190] Drachenkap", koord = {1104300, 1788500}, }, {--Nephritbucht name = "[190-200] Nephritbucht", koord = {1086900, 1655800}, } } } warpring.showwarps(warp) end function warp(tbl) local level = pc.get_level() if tbl.minlevel and level < tbl.minlevel then say("Dein Level ist zu niedrig, um diese Map zu betreten.") say("Minimal Level: "..tbl.minlevel) select("Abbrechen") return elseif tbl.maxlevel and level > tbl.maxlevel then say("Dein Level ist zu hoch, um diese Map zu betreten.") say("Maximal Level: "..tbl.maxlevel) select("Abbrechen") return end while not pc.can_warp() do say("Du kannst dich noch nicht teleportieren, da du in") say("den letzten 10 Sekunden gehandelt hast.") if select("Erneut versuchen", "Abbrechen") == 2 then return end end local warpneedstrings = warpring.get_warpneedstrings(tbl) if table.getn(warpneedstrings) > 0 then say("Um diese Map zu betreten benötigst du folgende") say("Dinge:") for _,v in ipairs(warpneedstrings) do say(v) end say("") say("Möchtest du trotzdem fortfahren?") if select("Teleportieren", "Abbrechen") == 2 then return end end if not warpring.check_and_remove_warpneeds(tbl) then say("Dir fehlt mindestens eins der benötigten Dinge.") select("Abbrechen") return end pc.warp(tbl.koord[1], tbl.koord[2]) end function get_warpneedstrings(tbl) local warpneeds = {} if tbl.itemneed and table.getn(tbl.itemneed) > 0 then for _,v in ipairs(tbl.itemneed) do table.insert(warpneeds, "- "..v[2].."x "..item_name(v[1])) end end if tbl.goldneed and tbl.goldneed > 0 then table.insert(warpneeds, "- "..tbl.goldneed.." Yang") end return warpneeds end function check_warpneeds(tbl) if tbl.itemneed and table.getn(tbl.itemneed) > 0 then for _,v in ipairs(tbl.itemneed) do if pc.count_item(v[1]) < v[2] then return false end end end if tbl.goldneed and tbl.goldneed > 0 then if pc.get_gold() < tbl.goldneed then return false end end return true end function remove_warpneeds(tbl) if tbl.itemneed and table.getn(tbl.itemneed) > 0 then for _,v in ipairs(tbl.itemneed) do pc.remove_item(v[1], v[2]) end end if tbl.goldneed and tbl.goldneed > 0 then pc.change_gold(-tbl.goldneed) end end function check_and_remove_warpneeds(tbl) if not warpring.check_warpneeds(tbl) then return false end warpring.remove_warpneeds(tbl) return true end function get_warpnames(tbl) local level = pc.get_level() local names = {} for _,v in ipairs(tbl) do if v.minlevel and level < v.minlevel then v.name = v.name.." (ab Lv. "..v.minlevel..")" elseif v.maxlevel and level > v.maxlevel then v.name = v.name.." (bis Lv. "..v.maxlevel..")" end table.insert(names, v.name) end return names end function showwarps(tbl) local warpnames = warpring.get_warpnames(tbl) local s = tbl[select3(warpnames)] or false if not s then return end if s.koord then warpring.warp(s) return end warpring.showwarps(s) end end end
kriege folgenden fehler :
Calls undeclared function !:
ipairs
select3
Error occured on compile warp_ring.quest
|
ipairs & select3 in die quest_functions eintragen und ggf deine questlib dementsprechend erweitern.
mfg.
|
|
|
09/01/2016, 15:47
|
#12400
|
elite*gold: 83
Join Date: Nov 2013
Posts: 2,891
Received Thanks: 2,764
|
select3 ersetzen durch select_table
Du kannst übrigens auch ein min und maxlvl für jede map eintragen
|
|
|
09/01/2016, 16:00
|
#12401
|
elite*gold: 0
Join Date: Jan 2009
Posts: 21
Received Thanks: 3
|
Danke =)also die quest wird jetz erfolgreich eingelesen aber bräuchte hilfe bei der questlib.lua für die funktionen ipairs & select3 kenne mich da leider null aus kann mir da einer helfen?würde mich echt freuen :hands down:
PHP Code:
CONFIRM_NO = 0 CONFIRM_YES = 1 CONFIRM_OK = 1 CONFIRM_TIMEOUT = 2 MALE = 0 FEMALE = 1 --quest.create = function(f) return coroutine.create(f) end --quest.process = function(co,args) return coroutine.resume(co, args) end setstate = q.setstate newstate = q.setstate q.set_clock = function(name, value) q.set_clock_name(name) q.set_clock_value(value) end q.set_counter = function(name, value) q.set_counter_name(name) q.set_counter_value(value) end c_item_name = function(vnum) return ("[ITEM value;"..vnum.."]") end c_mob_name = function(vnum) return ("[MOB value;"..vnum.."]") end -- d.set_folder = function (path) raw_script("[SET_PATH path;"..path.."]") end -- d.set_folder = function (path) path.show_cinematic("[SET_PATH path;"..path.."]") end -- party.run_cinematic = function (path) party.show_cinematic("[RUN_CINEMATIC value;"..path.."]") end newline = "[ENTER]" function color256(r, g, b) return "[COLOR r;"..(r/255.0).."|g;"..(g/255.0).."|b;"..(b/255.0).."]" end function color(r,g,b) return "[COLOR r;"..r.."|g;"..g.."|b;"..b.."]" end function delay(v) return "[DELAY value;"..v.."]" end function setcolor(r,g,b) raw_script(color(r,g,b)) end function setdelay(v) raw_script(delay(v)) end function resetcolor(r,g,b) raw_script("[/COLOR]") end function resetdelay(v) raw_script("[/DELAY]") end -- minimap에 동그라미 표시 function addmapsignal(x,y) raw_script("[ADDMAPSIGNAL x;"..x.."|y;"..y.."]") end -- minimap 동그라미들 모두 클리어 function clearmapsignal() raw_script("[CLEARMAPSIGNAL]") end -- 클라이언트에서 보여줄 대화창 배경 그림을 정한다. function setbgimage(src) raw_script("[BGIMAGE src;") raw_script(src) raw_script("]") end -- 대화창에 이미지를 보여준다. function addimage(x,y,src) raw_script("[IMAGE x;"..x.."|y;"..y) raw_script("|src;") raw_script(src) raw_script("]") end function makequestbutton(name) raw_script("[QUESTBUTTON idx;") raw_script(""..q.getcurrentquestindex()) raw_script("|name;") raw_script(name) raw_script("]") end function make_quest_button_ex(name, icon_type, icon_name) test_chat(icon_type) test_chat(icon_name) raw_script("[QUESTBUTTON idx;") raw_script(""..q.getcurrentquestindex()) raw_script("|name;") raw_script(name) raw_script("|icon_type;") raw_script(icon_type) raw_script("|icon_name;") raw_script(icon_name) raw_script("]") end function kill_in_my_level(vnum, level) ----Variablen --Mobs local mobs = { { {101, 657}; {701, 777}; {5101, 5116}; }; { {901, 937}; {1001, 1071}; {1101, 1107}; {1171, 1177}; {1301, 1303}; {1331, 1335}; {2001, 2076}; {2101, 2158}; {5121, 5157}; }; { {1401, 1603}; {2201, 2205}; {2231, 2235}; {2301, 2305}; {2311, 2414}; }; } local metin = { {8001, 8007}; {8008, 8017}; {8018, 8027}; } -- Levelbegrenzungen local lvl = {35, 65, 99} ---- local k=0 for i=1, 3 do if level<=lvl[i] and k==0 then k = i end end for i=1, table.getn(mobs[k]) do for p=mobs[k][i][1], mobs[k][i][2] do if vnum==p then return true end end end for p=metin[k][1], metin[k][2] do if vnum==p then return true end end return false end function make_quest_button(name) makequestbutton(name) end function send_letter_ex(name, icon_type, icon_name) make_quest_button_ex(name, icon_type, icon_name) setskin(NOWINDOW) q.set_title(name) q.start() end function send_letter(name) makequestbutton(name) setskin(NOWINDOW) q.set_title(name) q.start() end function clear_letter() q.done() end function say_title(name) say(color256(255, 230, 186)..name..color256(196, 196, 196)) end function say_reward(name) say(color256(255, 200, 200)..name..color256(196, 196, 196)) end function say_pc_name() say(pc.get_name()..":") end function say_size(width, height) say("[WINDOW_SIZE width;"..width.."|height;"..height.."]") end function setmapcenterposition(x,y) raw_script("[SETCMAPPOS x;") raw_script(x.."|y;") raw_script(y.."]") end function say_item(name, vnum, desc) say("[INSERT_IMAGE image_type;item|idx;"..vnum.."|title;"..name.."|desc;"..desc.."]") end function say_item_vnum(vnum) say_item(item_name(vnum), vnum, "") end function setvarchar(name, var) local laenge = string.len (var) local setchar = 0 local save_name = 0 local letter = 0 while laenge > setchar do setchar = setchar + 1 letter = string.sub (var, setchar, setchar) letter = string.byte(letter, 1) save_name = ""..name.."_char_"..setchar.."" pc.setqf(save_name, letter) end local save_laenge=""..name.."laenge" pc.setqf(save_laenge, laenge) end function getvarchar(name) local save_laenge = ""..name.."laenge" local laenge = pc.getqf(save_laenge) local save_name = 0 local var = "" local letter = 0 local getchar = 0 while laenge > getchar do getchar = getchar + 1 save_name = ""..name.."_char_"..getchar.."" letter = pc.getqf(save_name) if letter!=0 then letter = string.char(letter) else letter = "" end var = ""..var..""..letter.."" end return var end function delvarchar(name) local save_laenge = ""..name.."laenge" local laenge = pc.getqf(save_laenge) local getchar = 0 while laenge > getchar do getchar = getchar + 1 local save_name = ""..name.."_char_"..getchar.."" pc.delqf(save_name) end pc.delqf(save_laenge) end function global_setvarchar(name, var) local laenge = string.len (var) local setchar = 0 local save_name = 0 local letter = 0 while laenge > setchar do setchar = setchar + 1 letter = string.sub (var, setchar, setchar) letter = string.byte(letter) if letter==91 or letter==93 then letter=32 end save_name = ""..name.."_char_"..setchar.."" game.set_event_flag(save_name, letter) end local save_laenge=""..name.."laenge" game.set_event_flag(save_laenge, laenge) end function global_getvarchar(name) local save_laenge = ""..name.."laenge" local laenge = game.get_event_flag(save_laenge) local save_name = 0 local var = "" local letter = 0 local getchar = 0 while laenge > getchar do getchar = getchar + 1 save_name = ""..name.."_char_"..getchar.."" letter = game.get_event_flag(save_name) if letter!=0 then letter = string.char(letter) else letter = "" end var = ""..var..""..letter.."" end return var end function pc_is_novice() if pc.get_skill_group()==0 then return true else return false end end function pc_get_exp_bonus(exp, text) say_reward(text) pc.give_exp2(exp) set_quest_state("levelup", "run") end function pc_get_village_map_index(index) return village_map[pc.get_empire()][index] end village_map = { {1, 3}, {21, 23}, {41, 43}, } function npc_is_same_empire() if pc.get_empire()==npc.empire then return true else return false end end function npc_get_skill_teacher_race(pc_empire, pc_job, sub_job) if 1==sub_job then if 0==pc_job then return WARRIOR1_NPC_LIST[pc_empire] elseif 1==pc_job then return ASSASSIN1_NPC_LIST[pc_empire] elseif 2==pc_job then return SURA1_NPC_LIST[pc_empire] elseif 3==pc_job then return SHAMAN1_NPC_LIST[pc_empire] end elseif 2==sub_job then if 0==pc_job then return WARRIOR2_NPC_LIST[pc_empire] elseif 1==pc_job then return ASSASSIN2_NPC_LIST[pc_empire] elseif 2==pc_job then return SURA2_NPC_LIST[pc_empire] elseif 3==pc_job then return SHAMAN2_NPC_LIST[pc_empire] end end return 0 end function pc_find_square_guard_vid() if pc.get_empire()==1 then return find_npc_by_vnum(11000) elseif pc.get_empire()==2 then return find_npc_by_vnum(11002) elseif pc.get_empire()==3 then return find_npc_by_vnum(11004) end return 0 end function pc_find_skill_teacher_vid(sub_job) local vnum=npc_get_skill_teacher_race(pc.get_empire(), pc.get_job(), sub_job) return find_npc_by_vnum(vnum) end function pc_find_square_guard_vid() local pc_empire=pc.get_empire() if pc_empire==1 then return find_npc_by_vnum(11000) elseif pc_empire==2 then return find_npc_by_vnum(11002) elseif pc_empire==3 then return find_npc_by_vnum(11004) end end function npc_is_same_job() local pc_job=pc.get_job() local npc_vnum=npc.get_race() -- test_chat("pc.job:"..pc.get_job()) -- test_chat("npc_race:"..npc.get_race()) -- test_chat("pc.skill_group:"..pc.get_skill_group()) if pc_job==0 then if table_is_in(WARRIOR1_NPC_LIST, npc_vnum) then return true end if table_is_in(WARRIOR2_NPC_LIST, npc_vnum) then return true end elseif pc_job==1 then if table_is_in(ASSASSIN1_NPC_LIST, npc_vnum) then return true end if table_is_in(ASSASSIN2_NPC_LIST, npc_vnum) then return true end elseif pc_job==2 then if table_is_in(SURA1_NPC_LIST, npc_vnum) then return true end if table_is_in(SURA2_NPC_LIST, npc_vnum) then return true end elseif pc_job==3 then if table_is_in(SHAMAN1_NPC_LIST, npc_vnum) then return true end if table_is_in(SHAMAN2_NPC_LIST, npc_vnum) then return true end end return false end function npc_get_job() local npc_vnum=npc.get_race() if table_is_in(WARRIOR1_NPC_LIST, npc_vnum) then return COND_WARRIOR_1 end if table_is_in(WARRIOR2_NPC_LIST, npc_vnum) then return COND_WARRIOR_2 end if table_is_in(ASSASSIN1_NPC_LIST, npc_vnum) then return COND_ASSASSIN_1 end if table_is_in(ASSASSIN2_NPC_LIST, npc_vnum) then return COND_ASSASSIN_2 end if table_is_in(SURA1_NPC_LIST, npc_vnum) then return COND_SURA_1 end if table_is_in(SURA2_NPC_LIST, npc_vnum) then return COND_SURA_2 end if table_is_in(SHAMAN1_NPC_LIST, npc_vnum) then return COND_SHAMAN_1 end if table_is_in(SHAMAN2_NPC_LIST, npc_vnum) then return COND_SHAMAN_2 end return 0 end function time_min_to_sec(value) return 60*value end function time_hour_to_sec(value) return 3600*value end function next_time_set(value, test_value) local nextTime=get_time()+value if is_test_server() then nextTime=get_time()+test_value end pc.setqf("__NEXT_TIME__", nextTime) end function next_time_is_now(value) if get_time()>=pc.getqf("__NEXT_TIME__") then return true else return false end end function table_get_random_item(self) return self[number(1, table.getn(self))] end function table_is_in(self, test) for i = 1, table.getn(self) do if self[i]==test then return true end end return false end function giveup_quest_menu(title) local s=select("진행한다", "포기한다") if 2==s then say(title.." 퀘스트를 정말로") say("포기하시겠습니까?") local s=select("네, 그렇습니다", "아닙니다") if 1==s then say(title.."퀘스트를 포기했습니다") restart_quest() end end end function restart_quest() set_state("start") q.done() end function complete_quest() set_state("__COMPLETE__") q.done() end function giveup_quest() set_state("__GIVEUP__") q.done() end function complete_quest_state(state_name) set_state(state_name) q.done() end function test_chat(log) if is_test_server() then chat(log) end end function bool_to_str(is) if is then return "true" else return "false" end end WARRIOR1_NPC_LIST = {20300, 20320, 20340, } WARRIOR2_NPC_LIST = {20301, 20321, 20341, } ASSASSIN1_NPC_LIST = {20302, 20322, 20342, } ASSASSIN2_NPC_LIST = {20303, 20323, 20343, } SURA1_NPC_LIST = {20304, 20324, 20344, } SURA2_NPC_LIST = {20305, 20325, 20345, } SHAMAN1_NPC_LIST = {20306, 20326, 20346, } SHAMAN2_NPC_LIST = {20307, 20327, 20347, } function skill_group_dialog(e, j, g) -- e = 제국, j = 직업, g = 그룹 e = 1 -- XXX 메시지가 나라별로 있다가 하나로 통합되었음 -- 다른 직업이거나 다른 제국일 경우 if pc.job != j then say(locale.skill_group.dialog[e][pc.job][3]) elseif pc.get_skill_group() == 0 then if pc.level < 5 then say(locale.skill_group.dialog[e][j][g][1]) return end say(locale.skill_group.dialog[e][j][g][2]) local answer = select(locale.yes, locale.no) if answer == 1 then --say(locale.skill_group.dialog[e][j][g][2]) pc.set_skill_group(g) else --say(locale.skill_group.dialog[e][j][g][3]) end --elseif pc.get_skill_group() == g then --say(locale.skill_group.dialog[e][j][g][4]) --else --say(locale.skill_group.dialog[e][j][g][5]) end end function show_horse_menu() if horse.is_mine() then say(locale.horse_menu.menu) local s = 0 if horse.is_dead() then s = select(locale.horse_menu.revive, locale.horse_menu.ride, locale.horse_menu.unsummon, locale.horse_menu.close) else s = select(locale.horse_menu.feed, locale.horse_menu.ride, locale.horse_menu.unsummon, locale.horse_menu.close) end if s==1 then if horse.is_dead() then horse.revive() else local food = horse.get_grade() + 50054 - 1 if pc.countitem(food) > 0 then pc.removeitem(food, 1) horse.feed() else say(locale.need_item_prefix..item_name(food)..locale.need_item_postfix); end end elseif s==2 then horse.ride() elseif s==3 then horse.unsummon() elseif s==4 then -- do nothing end end end npc_index_table = { ['race'] = npc.getrace, ['empire'] = npc.get_empire, } pc_index_table = { ['weapon'] = pc.getweapon, ['level'] = pc.get_level, ['hp'] = pc.gethp, ['maxhp'] = pc.getmaxhp, ['sp'] = pc.getsp, ['maxsp'] = pc.getmaxsp, ['exp'] = pc.get_exp, ['nextexp'] = pc.get_next_exp, ['job'] = pc.get_job, ['money'] = pc.getmoney, ['gold'] = pc.getmoney, ['name'] = pc.getname, ['playtime'] = pc.getplaytime, ['leadership'] = pc.getleadership, ['empire'] = pc.getempire, ['skillgroup'] = pc.get_skill_group, ['x'] = pc.getx, ['y'] = pc.gety, ['local_x'] = pc.get_local_x, ['local_y'] = pc.get_local_y, } item_index_table = { ['vnum'] = item.get_vnum, ['name'] = item.get_name, ['size'] = item.get_size, ['count'] = item.get_count, ['type'] = item.get_type, ['sub_type'] = item.get_sub_type, ['refine_vnum'] = item.get_refine_vnum, ['level'] = item.get_level, } guild_war_bet_price_table = { 10000, 30000, 50000, 100000 } function npc_index(t,i) local npit = npc_index_table if npit[i] then return npit[i]() else return rawget(t,i) end end function pc_index(t,i) local pit = pc_index_table if pit[i] then return pit[i]() else return rawget(t,i) end end function item_index(t, i) local iit = item_index_table if iit[i] then return iit[i]() else return rawget(t, i) end end setmetatable(pc,{__index=pc_index}) setmetatable(npc,{__index=npc_index}) setmetatable(item,{__index=item_index}) --coroutine을 이용한 선택항 처리 function select(...) return q.yield('select', arg) end function select_table(table) return q.yield('select', table) end -- coroutine을 이용한 다음 엔터 기다리기 function wait() q.yield('wait') end function input() return q.yield('input') end function confirm(vid, msg, timeout) return q.yield('confirm', vid, msg, timeout) end function select_item() setskin(NOWINDOW) return q.yield('select_item') end --전역 변수 접근과 관련된 계열 NOWINDOW = 0 NORMAL = 1 CINEMATIC = 2 SCROLL = 3 WARRIOR = 0 ASSASSIN = 1 SURA = 2 SHAMAN = 3 COND_WARRIOR_0 = 8 COND_WARRIOR_1 = 16 COND_WARRIOR_2 = 32 COND_WARRIOR = 56 COND_ASSASSIN_0 = 64 COND_ASSASSIN_1 = 128 COND_ASSASSIN_2 = 256 COND_ASSASSIN = 448 COND_SURA_0 = 512 COND_SURA_1 = 1024 COND_SURA_2 = 2048 COND_SURA = 3584 COND_SHAMAN_0 = 4096 COND_SHAMAN_1 = 8192 COND_SHAMAN_2 = 16384 COND_SHAMAN = 28672 PART_MAIN = 0 PART_HAIR = 3 GUILD_CREATE_ITEM_VNUM = 70101 QUEST_SCROLL_TYPE_KILL_MOB = 1 QUEST_SCROLL_TYPE_KILL_ANOTHER_EMPIRE = 2 apply = { ["MAX_HP"] = 1, ["MAX_SP"] = 2, ["CON"] = 3, ["INT"] = 4, ["STR"] = 5, ["DEX"] = 6, ["ATT_SPEED"] = 7, ["MOV_SPEED"] = 8, ["CAST_SPEED"] = 9, ["HP_REGEN"] = 10, ["SP_REGEN"] = 11, ["POISON_PCT"] = 12, ["STUN_PCT"] = 13, ["SLOW_PCT"] = 14, ["CRITICAL_PCT"] = 15, ["PENETRATE_PCT"] = 16, ["ATTBONUS_HUMAN"] = 17, ["ATTBONUS_ANIMAL"] = 18, ["ATTBONUS_ORC"] = 19, ["ATTBONUS_MILGYO"] = 20, ["ATTBONUS_UNDEAD"] = 21, ["ATTBONUS_DEVIL"] = 22, ["STEAL_HP"] = 23, ["STEAL_SP"] = 24, ["MANA_BURN_PCT"] = 25, ["DAMAGE_SP_RECOVER"] = 26, ["BLOCK"] = 27, ["DODGE"] = 28, ["RESIST_SWORD"] = 29, ["RESIST_TWOHAND"] = 30, ["RESIST_DAGGER"] = 31, ["RESIST_BELL"] = 32, ["RESIST_FAN"] = 33, ["RESIST_BOW"] = 34, ["RESIST_FIRE"] = 35, ["RESIST_ELEC"] = 36, ["RESIST_MAGIC"] = 37, ["RESIST_WIND"] = 38, ["REFLECT_MELEE"] = 39, ["REFLECT_CURSE"] = 40, ["POISON_REDUCE"] = 41, ["KILL_SP_RECOVER"] = 42, ["EXP_DOUBLE_BONUS"] = 43, ["GOLD_DOUBLE_BONUS"] = 44, ["ITEM_DROP_BONUS"] = 45, ["POTION_BONUS"] = 46, ["KILL_HP_RECOVER"] = 47, ["IMMUNE_STUN"] = 48, ["IMMUNE_SLOW"] = 49, ["IMMUNE_FALL"] = 50, ["SKILL"] = 51, ["BOW_DISTANCE"] = 52, ["ATT_GRADE_BONUS"] = 53, ["DEF_GRADE_BONUS"] = 54, ["MAGIC_ATT_GRADE"] = 55, ["MAGIC_DEF_GRADE"] = 56, ["CURSE_PCT"] = 57, ["MAX_STAMINA"] = 58, ["ATTBONUS_WARRIOR"] = 59, ["ATTBONUS_ASSASSIN"] = 60, ["ATTBONUS_SURA"] = 61, ["ATTBONUS_SHAMAN"] = 62, ["ATTBONUS_MONSTER"] = 63, } -- 레벨업 퀘스트 -_- special = {} special.fortune_telling = { -- { prob 크리 item money remove money { 1, 0, 20, 20, 0 }, -- 10 { 499, 0, 10, 10, 0 }, -- 5 { 2500, 0, 5, 5, 0 }, -- 1 { 5000, 0, 0, 0, 0 }, { 1500, 0, -5, -5, 20000 }, { 499, 0, -10, -10, 20000 }, { 1, 0, -20, -20, 20000 }, } special.questscroll_reward = { {1, 1500, 3000, 30027, 0, 0 }, {2, 1500, 3000, 30028, 0, 0 }, {3, 1000, 2000, 30034, 30018, 0 }, {4, 1000, 2000, 30034, 30011, 0 }, {5, 1000, 2000, 30011, 30034, 0 }, {6, 1000, 2000, 27400, 0, 0 }, {7, 2000, 4000, 30023, 30003, 0 }, {8, 2000, 4000, 30005, 30033, 0 }, {9, 2000, 8000, 30033, 30005, 0 }, {10, 4000, 8000, 30021, 30033, 30045}, {11, 4000, 8000, 30045, 30022, 30046}, {12, 5000, 12000, 30047, 30045, 30055}, {13, 5000, 12000, 30051, 30017, 30058}, {14, 5000, 12000, 30051, 30007, 30041}, {15, 5000, 15000, 30091, 30017, 30018}, {16, 3500, 6500, 30021, 30033, 0 }, {17, 4000, 9000, 30051, 30033, 0 }, {18, 4500, 10000, 30056, 30057, 30058}, {19, 4500, 10000, 30059, 30058, 30041}, {20, 5000, 15000, 0, 0, 0 }, } special.active_skill_list = { { { 1, 2, 3, 4, 5}, { 16, 17, 18, 19, 20}, }, { {31, 32, 33, 34, 35}, {46, 47, 48, 49, 50}, }, { {61, 62, 63, 64, 65, 66}, {76, 77, 78, 79, 80, 81}, }, { {91, 92, 93, 94, 95, 96}, {106, 107, 108, 109, 110, 111}, }, } special.skill_reset_cost = { 2000, 2000, 2000, 2000, 2000, 2000, 4000, 6000, 8000, 10000, 14000, 18000, 22000, 28000, 34000, 41000, 50000, 59000, 70000, 90000, 101000, 109000, 114000, 120000, 131000, 141000, 157000, 176000, 188000, 200000, 225000, 270000, 314000, 348000, 393000, 427000, 470000, 504000, 554000, 600000, 758000, 936000, 1103000, 1276000, 1407000, 1568000, 1704000, 1860000, 2080000, 2300000, 2700000, 3100000, 3500000, 3900000, 4300000, 4800000, 5300000, 5800000, 6400000, 7000000, 8000000, 9000000, 10000000, 11000000, 12000000, 13000000, 14000000, 15000000, 16000000, 17000000, } special.levelup_img = { [101] = "dog.tga", [102] = "wolf.tga", [103] = "wolf.tga", [104] = "wolf.tga", [105] = "wolf.tga", [105] = "wolf.tga", [106] = "wolf.tga", [107] = "wolf.tga", [108] = "wild_boar.tga", [109] = "wild_boar.tga", [110] = "bear.tga", [111] = "bear.tga", [112] = "bear.tga", [113] = "bear.tga", [114] = "tiger.tga", [115] = "tiger.tga", [301] = "bak_inf.tga", [302] = "bak_gung.tga", [303] = "bak_gen1.tga", [304] = "bak_gen2.tga", [401] = "huk_inf.tga", [402] = "huk_dol.tga", [403] = "huk_gen1.tga", [404] = "huk_gen2.tga", [501] = "o_inf.tga", [502] = "o_jol.tga", [503] = "o_gung.tga", [504] = "o_jang.tga", [601] = "ung_inf.tga", [602] = "ung_chuk.tga", [603] = "ung_tu.tga", [701] = "mil_chu.tga", [702] = "mil_na.tga", [703] = "mil_na.tga", [704] = "mil_na.tga", [735] = "mil_jip.tga", [901] = "sigwi.tga", [903] = "gwoijil.tga", [2001] = "spider.tga", [2002] = "spider.tga", [2003] = "spider.tga", [2004] = "spider.tga", [2005] = "spider.tga", [2102] = "2102.tga", [2103] = "2103.tga", } special.levelup_quest = { -- monster kill monster kill -- vnum qty. vnum qty. exp percent { 0 , 0 , 0 , 0 , 0 } , -- lev 1 { 101 , 10 , 102 , 5 , 10 } , -- lev 2 { 101 , 20 , 102 , 10 , 10 } , -- lev 3 { 102 , 15 , 103 , 5 , 10 } , -- lev 4 { 103 , 10 , 104 , 10 , 10 } , -- lev 5 { 104 , 20 , 108 , 10 , 10 } , -- lev 6 { 108 , 10 , 105 , 5 , 10 } , -- lev 7 { 108 , 20 , 105 , 10 , 10 } , -- lev 8 { 105 , 15 , 109 , 5 , 10 } , -- lev 9 { 105 , 20 , 109 , 10 , 10 } , -- lev 10 { 109 , 10 , 110 , 5 , 10 } , -- lev 11 { 110 , 15 , 106 , 10 , 10 } , -- lev 12 { 106 , 20 , 111 , 5 , 10 } , -- lev 13 { 111 , 15 , 107 , 5 , 10 } , -- lev 14 { 111 , 20 , 107 , 10 , 10 } , -- lev 15 { 107 , 15 , 114 , 5 , 10 } , -- lev 16 { 107 , 20 , 114 , 10 , 10 } , -- lev 17 { 114 , 10 , 112 , 10 , 10 } , -- lev 18 { 112 , 20 , 113 , 10 , 10 } , -- lev 19 { 113 , 20 , 302 , 15 , 10 } , -- lev 20 { 302 , 20 , 115 , 10 , "2-10" } , -- lev 21 { 115 , 25 , 304 , 10 , "2-10" } , -- lev 22 { 304 , 20 , 401 , 40 , "2-10" } , -- lev 23 { 401 , 60 , 402 , 80 , "2-10" } , -- lev 24 { 501 , 80 , 404 , 20 , "2-10" } , -- lev 25 { 502 , 80 , 406 , 20 , "2-10" } , -- lev 26 { 406 , 30 , 504 , 20 , "2-10" } , -- lev 27 { 631 , 35 , 504 , 30 , "2-10" } , -- lev 28 { 631 , 40 , 632 , 30 , "2-10" } , -- lev 29 { 632 , 40 , 2102 , 30 , "2-10" } , -- lev 30 { 632 , 50 , 2102 , 45 , "2-5" } , -- lev 31 { 633 , 45 , 2001 , 40 , "2-5" } , -- lev 32 { 701 , 35 , 2103 , 30 , "2-5" } , -- lev 33 { 701 , 40 , 2103 , 40 , "2-5" } , -- lev 34 { 702 , 40 , 2002 , 30 , "2-5" } , -- lev 35 { 704 , 20 , 2106 , 20 , "2-5" } , -- lev 36 { 733 , 30 , 2003 , 20 , "2-5" } , -- lev 37 { 734 , 40 , 2004 , 20 , "2-5" } , -- lev 38 { 706 , 40 , 2005 , 30 , "2-5" } , -- lev 39 { 707 , 40 , 2108 , 20 , "2-5" } , -- lev 40 { 901 , 40 , 5123 , 25 , "2-5" } , -- lev 41 { 902 , 30 , 5123 , 30 , "2-5" } , -- lev 42 { 902 , 40 , 2031 , 35 , "2-5" } , -- lev 43 { 903 , 40 , 2031 , 40 , "2-5" } , -- lev 44 { 731 , 50 , 2032 , 45 , "2-5" } , -- lev 45 { 732 , 30 , 5124 , 30 , "2-5" } , -- lev 46 { 903 , 35 , 5125 , 30 , "2-5" } , -- lev 47 { 904 , 40 , 5125 , 35 , "2-5" } , -- lev 48 { 733 , 40 , 2033 , 45 , "2-5" } , -- lev 49 { 734 , 40 , 5126 , 20 , "2-5" } , -- lev 50 { 735 , 50 , 5126 , 30 , "1-4" } , -- lev 51 { 904 , 45 , 2034 , 45 , "1-4" } , -- lev 52 { 904 , 50 , 2034 , 50 , "1-4" } , -- lev 53 { 736 , 40 , 1001 , 30 , "1-4" } , -- lev 54 { 737 , 40 , 1301 , 35 , "1-4" } , -- lev 55 { 905 , 50 , 1002 , 30 , "1-4" } , -- lev 56 { 905 , 60 , 1002 , 40 , "1-4" } , -- lev 57 { 906 , 45 , 1303 , 40 , "1-4" } , -- lev 58 { 906 , 50 , 1303 , 45 , "1-4" } , -- lev 59 { 907 , 45 , 1003 , 40 , "1-4" } , -- lev 60 } special.levelup_reward1 = { -- warrior assassin sura shaman { 0, 0, 0, 0 }, { 11200, 11400, 11600, 11800 }, -- 갑옷 lev2 { 12200, 12340, 12480, 12620 }, -- 투구 lev3 { 13000, 13000, 13000, 13000 } -- 방패 lev4 } -- levelup_reward1 테이블 크기보다 레벨이 높아지면 아래 -- 테이블을 이용하여 아이템을 준다. special.levelup_reward3 = { -- pct item # item count { 33, 27002, 10 }, -- 25% { 67, 27005, 10 }, -- 25% --{ 75, 27101, 5 }, -- 25% { 100, 27114, 5 }, -- 25% } special.levelup_reward_gold21 = { { 10000, 20 }, { 20000, 50 }, { 40000, 25 }, { 80000, 3 }, { 100000, 2 }, } special.levelup_reward_gold31 = { { 20000, 20 }, { 40000, 40 }, { 60000, 25 }, { 80000, 10 }, { 100000, 5 }, } special.levelup_reward_gold41 = { { 40000, 20 }, { 60000, 40 }, { 80000, 25 }, { 100000, 10 }, { 150000, 5 }, } special.levelup_reward_gold51 = { { 60000, 20 }, { 80000, 40 }, { 100000, 25 }, { 150000, 10 }, { 200000, 5 }, } special.levelup_reward_exp21 = { { 2, 9 }, { 3, 14 }, { 4, 39 }, { 6, 24 }, { 8, 9 }, { 10, 4 }, } special.levelup_reward_exp31 = { { 2, 10 }, { 2.5, 15 }, { 3, 40 }, { 3.5, 25 }, { 4, 8 }, { 4.5, 5 }, { 5, 2 }, } special.levelup_reward_exp41 = { { 2, 10 }, { 2.5, 15 }, { 3, 40 }, { 3.5, 25 }, { 4, 8 }, { 4.5, 5 }, { 5, 2 }, } special.levelup_reward_exp51 = { { 1, 10 }, { 1.5, 15 }, { 2, 40 }, { 2.5, 25 }, { 3, 8 }, { 3.5, 5 }, { 4, 2 }, } special.levelup_reward_item_21 = { -- no couple ring { { 27002, 10 }, { 27005, 10 }, { 27114, 10 } }, -- lev 21 { 15080, 15100, 15120, 15140 }, -- lev 22 { 16080, 16100, 16120, 16140 }, -- lev 23 { 17080, 17100, 17120, 17140 }, -- lev 24 { { 27002, 10 }, { 27005, 10 }, { 27114, 10 } }, -- lev 25 { { 27003, 20 }, { 27006, 20 }, { 27114, 10 } }, -- over lev 25 -- with couple ring -- { { 27002, 10 }, { 27005, 10 }, { 27114, 10 }, { 70301, 1 } }, -- lev 21 -- { 15080, 15100, 15120, 15140, 70301 }, -- lev 22 -- { 16080, 16100, 16120, 16140, 70301 }, -- lev 23 -- { 17080, 17100, 17120, 17140, 70301 }, -- lev 24 -- { { 27002, 10 }, { 27005, 10 }, { 27114, 10 }, { 70301, 1 } }, -- lev 25 -- { { 27003, 20 }, { 27006, 20 }, { 27114, 10 } }, -- over lev 25 } special.warp_to_pos = { -- 승룡곡 { { 402100, 673900 }, { 270400, 739900 }, { 321300, 808000 }, }, --도염화지 { --A 5994 7563 --B 5978 6222 --C 7307 6898 { 599400, 756300 }, { 597800, 622200 }, { 730700, 689800 }, }, --영비사막 { --A 2178 6272 { 217800, 627200 }, --B 2219 5027 { 221900, 502700 }, --C 3440 5025 { 344000, 502500 }, }, --서한산 { --A 4342 2906 { 434200, 290600 }, --B 3752 1749 { 375200, 174900 }, --C 4918 1736 { 491800, 173600 }, }, } special.devil_tower = { --{ 123, 608 }, { 2048+126, 6656+384 }, { 2048+134, 6656+147 }, { 2048+369, 6656+629 }, { 2048+369, 6656+401 }, { 2048+374, 6656+167 }, { 2048+579, 6656+616 }, { 2048+578, 6656+392 }, { 2048+575, 6656+148 }, } special.lvq_map = { { -- "A1" 1 {}, { { 440, 565 }, { 460, 771 }, { 668, 800 },}, { { 440, 565 }, { 460, 771 }, { 668, 800 },}, { { 440, 565 }, { 460, 771 }, { 668, 800 },}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{853,557}, {845,780}, {910,956},}, {{853,557}, {845,780}, {910,956},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{224,395}, {137,894}, {206,830}, {266,1067},}, {{224,395}, {137,894}, {206,830}, {266,1067},}, {{224,395}, {137,894}, {206,830}, {266,1067},}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, }, { -- "A2" 2 {}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{244,1309}, {4567,1080}, {496,885}, {798,975}, {1059,1099}, {855,1351},}, {{244,1309}, {4567,1080}, {496,885}, {798,975}, {1059,1099}, {855,1351},}, {{244,1309}, {4567,1080}, {496,885}, {798,975}, {1059,1099}, {855,1351},}, {{244,1309}, {4567,1080}, {496,885}, {798,975}, {1059,1099}, {855,1351},}, {{193,772}, {390,402}, {768,600}, {1075,789}, {1338,813},}, {{193,772}, {390,402}, {768,600}, {1075,789}, {1338,813},}, }, { -- "A3" 3 {}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{438, 895}, {725, 864}, {632, 671},}, {{438, 895}, {725, 864}, {632, 671},}, {{438, 895}, {725, 864}, {632, 671},}, {{438, 895}, {725, 864}, {632, 671},}, {{438, 895}, {725, 864}, {632, 671},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{200,277}, {130,646}, {211,638}, {291,851},}, {{200,277}, {130,646}, {211,638}, {291,851},}, {{200,277}, {130,646}, {211,638}, {291,851},}, {{100,150}}, {{100,150}}, {{100,150}}, {{100,150}}, {{100,150}}, {{100,150}}, }, {}, -- 4 {}, -- 5 {}, -- 6 {}, -- 7 {}, -- 8 {}, -- 9 {}, -- 10 {}, -- 11 {}, -- 12 {}, -- 13 {}, -- 14 {}, -- 15 {}, -- 16 {}, -- 17 {}, -- 18 {}, -- 19 {}, -- 20 { -- "B1" 21 {}, {{412,635}, {629,428}, {829,586},}, {{412,635}, {629,428}, {829,586},}, {{412,635}, {629,428}, {829,586},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{866,822}, {706,224}, {247,722},}, {{866,822}, {706,224}, {247,722},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{496,1089}, {890,1043},}, {{496,1089}, {890,1043},}, {{496,1089}, {890,1043},}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{908,87}}, {{908,87}}, {{908,87}}, {{908,87}}, {{908,87}}, {{908,87}}, }, { -- "B2" 22 {}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{ 172,810}, {288,465}, {475,841}, {303,156}, {687,466},}, {{ 172,810}, {288,465}, {475,841}, {303,156}, {687,466},}, {{ 172,810}, {288,465}, {475,841}, {303,156}, {687,466},}, {{ 172,810}, {288,465}, {475,841}, {303,156}, {687,466},}, {{787,235}, {1209,382}, {1350,571}, {1240,852}, {1254,1126}, {1078,1285}, {727,1360},}, {{787,235}, {1209,382}, {1350,571}, {1240,852}, {1254,1126}, {1078,1285}, {727,1360},}, }, { -- "B3" 23 {}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{230, 244}, {200, 444}, {594, 408},}, {{230, 244}, {200, 444}, {594, 408},}, {{230, 244}, {200, 444}, {594, 408},}, {{230, 244}, {200, 444}, {594, 408},}, {{230, 244}, {200, 444}, {594, 408},}, {{584,204}, {720,376}, {861,272},}, {{584,204}, {720,376}, {861,272},}, {{584,204}, {720,376}, {861,272},}, {{584,204}, {720,376}, {861,272},}, {{584,204}, {720,376}, {861,272},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{816,721}, {489,823},}, {{816,721}, {489,823},}, {{816,721}, {489,823},}, {{772,140}}, {{772,140}}, {{772,140}}, {{772,140}}, {{772,140}}, {{772,140}}, }, {}, -- 24 {}, -- 25 {}, -- 26 {}, -- 27 {}, -- 28 {}, -- 29 {}, -- 30 {}, -- 31 {}, -- 32 {}, -- 33 {}, -- 34 {}, -- 35 {}, -- 36 {}, -- 37 {}, -- 38 {}, -- 39 {}, -- 40 { -- "C1" 41 {}, {{385,446}, {169,592}, {211,692}, {632,681},}, {{385,446}, {169,592}, {211,692}, {632,681},}, {{385,446}, {169,592}, {211,692}, {632,681},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{169,362}, {368,304}, {626,409}, {187,882}, {571,858},}, {{169,362}, {368,304}, {626,409}, {187,882}, {571,858},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{452,160}, {536,1034}, {184,1044},}, {{452,160}, {536,1034}, {184,1044},}, {{452,160}, {536,1034}, {184,1044},}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, }, { -- "C2" 42 {}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{991,222}, {1201,525}, {613,232}, {970,751}, {1324,790},}, {{991,222}, {1201,525}, {613,232}, {970,751}, {1324,790},}, {{991,222}, {1201,525}, {613,232}, {970,751}, {1324,790},}, {{991,222}, {1201,525}, {613,232}, {970,751}, {1324,790},}, {{192,211}, {247,600}, {249,882}, {987,981}, {1018,1288}, {1303,1174},}, {{192,211}, {247,600}, {249,882}, {987,981}, {1018,1288}, {1303,1174},}, }, { -- "C3" 43 {}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{421, 189}, {167, 353},}, {{421, 189}, {167, 353},}, {{421, 189}, {167, 353},}, {{421, 189}, {167, 353},}, {{421, 189}, {167, 353},}, {{679,459}, {505,709},}, {{679,459}, {505,709},}, {{679,459}, {505,709},}, {{679,459}, {505,709},}, {{679,459}, {505,709},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{635,856}, {324,855},}, {{635,856}, {324,855},}, {{635,856}, {324,855},}, {{136,899}}, {{136,899}}, {{136,899}}, {{136,899}}, {{136,899}}, {{136,899}}, }, {}, -- 44 {}, -- 45 {}, -- 46 {}, -- 47 {}, -- 48 {}, -- 49 {}, -- 50 {}, -- 51 {}, -- 52 {}, -- 53 {}, -- 54 {}, -- 55 {}, -- 56 {}, -- 57 {}, -- 58 {}, -- 59 {}, -- 60 } function BuildSkillList(job, group) local skill_vnum_list = {} local skill_name_list = {} if pc.get_skill_group() != 0 then local skill_list = special.active_skill_list[job+1][group] table.foreachi( skill_list, function(i, t) local lev = pc.get_skill_level(t) if lev > 0 then local name = locale.GM_SKILL_NAME_DICT[t] if name != nil then table.insert(skill_vnum_list, t) table.insert(skill_name_list, name) end end end ) end table.insert(skill_vnum_list, 0) table.insert(skill_name_list, locale.cancel) return { skill_vnum_list, skill_name_list } end PREMIUM_EXP = 0 PREMIUM_ITEM = 1 PREMIUM_SAFEBOX = 2 PREMIUM_AUTOLOOT = 3 PREMIUM_FISH_MIND = 4 PREMIUM_MARRIAGE_FAST = 5 PREMIUM_GOLD = 6 -- point type start POINT_NONE = 0 POINT_LEVEL = 1 POINT_VOICE = 2 POINT_EXP = 3 POINT_NEXT_EXP = 4 POINT_HP = 5 POINT_MAX_HP = 6 POINT_SP = 7 POINT_MAX_SP = 8 POINT_STAMINA = 9 --스테미너 POINT_MAX_STAMINA = 10 --최대 스테미너 POINT_GOLD = 11 POINT_ST = 12 --근력 POINT_HT = 13 --체력 POINT_DX = 14 --민첩성 POINT_IQ = 15 --정신력 POINT_DEF_GRADE = 16 POINT_ATT_SPEED = 17 --공격속도 POINT_ATT_GRADE = 18 --공격력 MAX POINT_MOV_SPEED = 19 --이동속도 POINT_CLIENT_DEF_GRADE = 20 --방어등급 POINT_CASTING_SPEED = 21 --주문속도 (쿨다운타임*100) / (100 + 이값) = 최종 쿨다운 타임 POINT_MAGIC_ATT_GRADE = 22 --마법공격력 POINT_MAGIC_DEF_GRADE = 23 --마법방어력 POINT_EMPIRE_POINT = 24 --제국점수 POINT_LEVEL_STEP = 25 --한 레벨에서의 단계.. (1 2 3 될 때 보상 4 되면 레벨 업) POINT_STAT = 26 --능력치 올릴 수 있는 개수 POINT_SUB_SKILL = 27 --보조 스킬 포인트 POINT_SKILL = 28 --액티브 스킬 포인트 POINT_WEAPON_MIN = 29 --무기 최소 데미지 POINT_WEAPON_MAX = 30 --무기 최대 데미지 POINT_PLAYTIME = 31 --플레이시간 POINT_HP_REGEN = 32 --HP 회복률 POINT_SP_REGEN = 33 --SP 회복률 POINT_BOW_DISTANCE = 34 --활 사정거리 증가치 (meter) POINT_HP_RECOVERY = 35 --체력 회복 증가량 POINT_SP_RECOVERY = 36 --정신력 회복 증가량 POINT_POISON_PCT = 37 --독 확률 POINT_STUN_PCT = 38 --기절 확률 POINT_SLOW_PCT = 39 --슬로우 확률 POINT_CRITICAL_PCT = 40 --크리티컬 확률 POINT_PENETRATE_PCT = 41 --관통타격 확률 POINT_CURSE_PCT = 42 --저주 확률 POINT_ATTBONUS_HUMAN = 43 --인간에게 강함 POINT_ATTBONUS_ANIMAL = 44 --동물에게 데미지 % 증가 POINT_ATTBONUS_ORC = 45 --웅귀에게 데미지 % 증가 POINT_ATTBONUS_MILGYO = 46 --밀교에게 데미지 % 증가 POINT_ATTBONUS_UNDEAD = 47 --시체에게 데미지 % 증가 POINT_ATTBONUS_DEVIL = 48 --마귀(악마)에게 데미지 % 증가 POINT_ATTBONUS_INSECT = 49 --벌레족 POINT_ATTBONUS_FIRE = 50 --화염족 POINT_ATTBONUS_ICE = 51 --빙설족 POINT_ATTBONUS_DESERT = 52 --사막족 POINT_ATTBONUS_MONSTER = 53 --모든 몬스터에게 강함 POINT_ATTBONUS_WARRIOR = 54 --무사에게 강함 POINT_ATTBONUS_ASSASSIN = 55 --자객에게 강함 POINT_ATTBONUS_SURA = 56 --수라에게 강함 POINT_ATTBONUS_SHAMAN = 57 --무당에게 강함 -- ADD_TRENT_MONSTER POINT_ATTBONUS_TREE = 58 --나무에게 강함 20050729.myevan UNUSED5 -- END_OF_ADD_TRENT_MONSTER POINT_RESIST_WARRIOR = 59 --무사에게 저항 POINT_RESIST_ASSASSIN = 60 --자객에게 저항 POINT_RESIST_SURA = 61 --수라에게 저항 POINT_RESIST_SHAMAN = 62 --무당에게 저항 POINT_STEAL_HP = 63 --생명력 흡수 POINT_STEAL_SP = 64 --정신력 흡수 POINT_MANA_BURN_PCT = 65 --마나 번 --/ 피해시 보너스 =/ POINT_DAMAGE_SP_RECOVER = 66 --공격당할 시 정신력 회복 확률 POINT_BLOCK = 67 --블럭율 POINT_DODGE = 68 --회피율 POINT_RESIST_SWORD = 69 POINT_RESIST_TWOHAND = 70 POINT_RESIST_DAGGER = 71 POINT_RESIST_BELL = 72 POINT_RESIST_FAN = 73 POINT_RESIST_BOW = 74 --화살 저항 : 대미지 감소 POINT_RESIST_FIRE = 75 --화염 저항 : 화염공격에 대한 대미지 감소 POINT_RESIST_ELEC = 76 --전기 저항 : 전기공격에 대한 대미지 감소 POINT_RESIST_MAGIC = 77 --술법 저항 : 모든술법에 대한 대미지 감소 POINT_RESIST_WIND = 78 --바람 저항 : 바람공격에 대한 대미지 감소 POINT_REFLECT_MELEE = 79 --공격 반사 --/ 특수 피해시 =/ POINT_REFLECT_CURSE = 80 --저주 반사 POINT_POISON_REDUCE = 81 --독데미지 감소 --/ 적 소멸시 =/ POINT_KILL_SP_RECOVER = 82 --적 소멸시 MP 회복 POINT_EXP_DOUBLE_BONUS = 83 POINT_GOLD_DOUBLE_BONUS = 84 POINT_ITEM_DROP_BONUS = 85 --/ 회복 관련 =/ POINT_POTION_BONUS = 86 POINT_KILL_HP_RECOVERY = 87 POINT_IMMUNE_STUN = 88 POINT_IMMUNE_SLOW = 89 POINT_IMMUNE_FALL = 90 --======== POINT_PARTY_ATTACKER_BONUS = 91 POINT_PARTY_TANKER_BONUS = 92 POINT_ATT_BONUS = 93 POINT_DEF_BONUS = 94 POINT_ATT_GRADE_BONUS = 95 POINT_DEF_GRADE_BONUS = 96 POINT_MAGIC_ATT_GRADE_BONUS = 97 POINT_MAGIC_DEF_GRADE_BONUS = 98 POINT_RESIST_NORMAL_DAMAGE = 99 POINT_HIT_HP_RECOVERY = 100 POINT_HIT_SP_RECOVERY = 101 POINT_MANASHIELD = 102 --흑신수호 스킬에 의한 마나쉴드 효과 정도 POINT_PARTY_BUFFER_BONUS = 103 POINT_PARTY_SKILL_MASTER_BONUS = 104 POINT_HP_RECOVER_CONTINUE = 105 POINT_SP_RECOVER_CONTINUE = 106 POINT_STEAL_GOLD = 107 POINT_POLYMORPH = 108 --변신한 몬스터 번호 POINT_MOUNT = 109 --타고있는 몬스터 번호 POINT_PARTY_HASTE_BONUS = 110 POINT_PARTY_DEFENDER_BONUS = 111 POINT_STAT_RESET_COUNT = 112 --피의 단약 사용을 통한 스텟 리셋 포인트 (1당 1포인트 리셋가능) POINT_HORSE_SKILL = 113 POINT_MALL_ATTBONUS = 114 --공격력 +x% POINT_MALL_DEFBONUS = 115 --방어력 +x% POINT_MALL_EXPBONUS = 116 --경험치 +x% POINT_MALL_ITEMBONUS = 117 --아이템 드롭율 x/10배 POINT_MALL_GOLDBONUS = 118 --돈 드롭율 x/10배 POINT_MAX_HP_PCT = 119 --최대생명력 +x% POINT_MAX_SP_PCT = 120 --최대정신력 +x% POINT_SKILL_DAMAGE_BONUS = 121 --스킬 데미지 *(100+x)% POINT_NORMAL_HIT_DAMAGE_BONUS = 122 --평타 데미지 *(100+x)% -- DEFEND_BONUS_ATTRIBUTES POINT_SKILL_DEFEND_BONUS = 123 --스킬 방어 데미지 POINT_NORMAL_HIT_DEFEND_BONUS = 124 --평타 방어 데미지 -- END_OF_DEFEND_BONUS_ATTRIBUTES -- PC_BANG_ITEM_ADD POINT_PC_BANG_EXP_BONUS = 125 --PC방 전용 경험치 보너스 POINT_PC_BANG_DROP_BONUS = 126 --PC방 전용 드롭률 보너스 -- END_PC_BANG_ITEM_ADD -- POINT_MAX_NUM = 128 common/length.h -- point type start function say_blue(name) say(color256(0, 0, 255)..name..color256(0, 0, 255)) end function say_red(name) say(color256(255, 0, 0)..name..color256(255, 0, 0)) end function say_green(name) say(color256(0, 238, 0)..name..color256(0, 238, 0)) end function say_gold(name) say(color256(255, 215, 0)..name..color256(255, 215, 0)) end function say_black(name) say(color256(0, 0, 0)..name..color256(0, 0, 0)) end function say_white(name) say(color256(255, 255, 255)..name..color256(255, 255, 255)) end function say_yellow(name) say(color256(255, 255, 0)..name..color256(255, 255, 0)) end function say_blue2(name) say(color256(0, 206, 209)..name..color256(0, 206, 209)) end function npc.is_metin() local nr = mysql_query("select metin from player.mob_proto where vnum = '"..npc.get_race().."';") if tonumber(nr) == 1 then return true else return false end end function give_dm(z) os.execute("mysql -u root account --execute='UPDATE account SET cash = cash + ".. z .." WHERE id = ".. pc.get_account_id() ..";'") os.execute("mysql -u root log --execute='INSERT INTO voucher_log (account_id, pocet, cas) VALUES (".. pc.get_account_id() ..", ".. z ..", NOW());'") end function setenergy(typ,value,timez) pc.setqf("energy_value", value) pc.setqf("energy_date", get_time() + timez) pc.setqf("energy_typ", typ) end function setenergytime(timez) pc.setqf("energy_date", timez) end function getenergytyp() return pc.getqf("energy_typ") end function getenergyvalue() return pc.getqf("energy_value") end function getenergytime() return pc.getqf("energy_date") end function split(str, delim, maxNb) if str == nil then return str end if string.find(str, delim) == nil then return { str } end if maxNb == nil or maxNb < 1 then maxNb = 0 end local result = {} local pat = "(.-)" .. delim .. "()" local nb = 0 local lastPos for part, pos in string.gfind(str, pat) do nb = nb + 1 result[nb] = part lastPos = pos if nb == maxNb then break end end if nb ~= maxNb then result[nb + 1] = string.sub(str, lastPos) end return result end mysql_query = function(query) if not pre then local rt = io.open('CONFIG','r'):read('*all') pre,_= string.gsub(rt,'.+PLAYER_SQL:%s(%S+)%s(%S+)%s(%S+)%s(%S+).+','-h%1 -u%2 -p%3 -D%4') end math.randomseed(os.time()) local fi,t,out = 'mysql_data_'..math.random(10^9)+math.random(2^4,2^10),{},{} --os.execute('mysql '..pre..' --e='..string.format('%q',query)..' > '..fi) -- f? MySQL51 os.execute('mysql '..pre..' -e'..string.format('%q',query)..' > '..fi) -- f? MySQL55 for av in io.open(fi,'r'):lines() do table.insert(t,split(av,'\t')) end; os.remove(fi); for i = 2, table.getn(t) do table.foreach(t[i],function(a,b) out[i-1] = out[i-1] or {} out[i-1][a] = tonumber(b) or b or 'NULL' out[t[1][a]] = out[t[1][a]] or {} out[t[1][a]][i-1] = tonumber(b) or b or 'NULL' end) end return out end -- Entferne Leerzeichen vor und nach dem String function string.trim(str) return (string.gsub(str, "^%s*(.-)%s*$", "%1")) end -- String zu Array ?er Seperator function string.explode(str, sep) if sep == "" or str == "" then error("Fehlende Parameter") end local pos, t = 1, {} for s, e in function() return string.find(str, sep, pos) end do table.insert(t, string.trim(string.sub(str, pos, s-1))) pos = e+1 end table.insert(t, string.trim(string.sub(str, pos))) return t end dofile("/usr/home/game/quest/cube.lua")
|
|
|
09/01/2016, 17:41
|
#12402
|
elite*gold: 83
Join Date: Nov 2013
Posts: 2,891
Received Thanks: 2,764
|
Quote:
Originally Posted by nickyo
Danke =)also die quest wird jetz erfolgreich eingelesen aber bräuchte hilfe bei der questlib.lua für die funktionen ipairs & select3 kenne mich da leider null aus kann mir da einer helfen?würde mich echt freuen :hands down:
PHP Code:
CONFIRM_NO = 0 CONFIRM_YES = 1 CONFIRM_OK = 1 CONFIRM_TIMEOUT = 2 MALE = 0 FEMALE = 1 --quest.create = function(f) return coroutine.create(f) end --quest.process = function(co,args) return coroutine.resume(co, args) end setstate = q.setstate newstate = q.setstate q.set_clock = function(name, value) q.set_clock_name(name) q.set_clock_value(value) end q.set_counter = function(name, value) q.set_counter_name(name) q.set_counter_value(value) end c_item_name = function(vnum) return ("[ITEM value;"..vnum.."]") end c_mob_name = function(vnum) return ("[MOB value;"..vnum.."]") end -- d.set_folder = function (path) raw_script("[SET_PATH path;"..path.."]") end -- d.set_folder = function (path) path.show_cinematic("[SET_PATH path;"..path.."]") end -- party.run_cinematic = function (path) party.show_cinematic("[RUN_CINEMATIC value;"..path.."]") end newline = "[ENTER]" function color256(r, g, b) return "[COLOR r;"..(r/255.0).."|g;"..(g/255.0).."|b;"..(b/255.0).."]" end function color(r,g,b) return "[COLOR r;"..r.."|g;"..g.."|b;"..b.."]" end function delay(v) return "[DELAY value;"..v.."]" end function setcolor(r,g,b) raw_script(color(r,g,b)) end function setdelay(v) raw_script(delay(v)) end function resetcolor(r,g,b) raw_script("[/COLOR]") end function resetdelay(v) raw_script("[/DELAY]") end -- minimap에 동그라미 표시 function addmapsignal(x,y) raw_script("[ADDMAPSIGNAL x;"..x.."|y;"..y.."]") end -- minimap 동그라미들 모두 클리어 function clearmapsignal() raw_script("[CLEARMAPSIGNAL]") end -- 클라이언트에서 보여줄 대화창 배경 그림을 정한다. function setbgimage(src) raw_script("[BGIMAGE src;") raw_script(src) raw_script("]") end -- 대화창에 이미지를 보여준다. function addimage(x,y,src) raw_script("[IMAGE x;"..x.."|y;"..y) raw_script("|src;") raw_script(src) raw_script("]") end function makequestbutton(name) raw_script("[QUESTBUTTON idx;") raw_script(""..q.getcurrentquestindex()) raw_script("|name;") raw_script(name) raw_script("]") end function make_quest_button_ex(name, icon_type, icon_name) test_chat(icon_type) test_chat(icon_name) raw_script("[QUESTBUTTON idx;") raw_script(""..q.getcurrentquestindex()) raw_script("|name;") raw_script(name) raw_script("|icon_type;") raw_script(icon_type) raw_script("|icon_name;") raw_script(icon_name) raw_script("]") end function kill_in_my_level(vnum, level) ----Variablen --Mobs local mobs = { { {101, 657}; {701, 777}; {5101, 5116}; }; { {901, 937}; {1001, 1071}; {1101, 1107}; {1171, 1177}; {1301, 1303}; {1331, 1335}; {2001, 2076}; {2101, 2158}; {5121, 5157}; }; { {1401, 1603}; {2201, 2205}; {2231, 2235}; {2301, 2305}; {2311, 2414}; }; } local metin = { {8001, 8007}; {8008, 8017}; {8018, 8027}; } -- Levelbegrenzungen local lvl = {35, 65, 99} ---- local k=0 for i=1, 3 do if level<=lvl[i] and k==0 then k = i end end for i=1, table.getn(mobs[k]) do for p=mobs[k][i][1], mobs[k][i][2] do if vnum==p then return true end end end for p=metin[k][1], metin[k][2] do if vnum==p then return true end end return false end function make_quest_button(name) makequestbutton(name) end function send_letter_ex(name, icon_type, icon_name) make_quest_button_ex(name, icon_type, icon_name) setskin(NOWINDOW) q.set_title(name) q.start() end function send_letter(name) makequestbutton(name) setskin(NOWINDOW) q.set_title(name) q.start() end function clear_letter() q.done() end function say_title(name) say(color256(255, 230, 186)..name..color256(196, 196, 196)) end function say_reward(name) say(color256(255, 200, 200)..name..color256(196, 196, 196)) end function say_pc_name() say(pc.get_name()..":") end function say_size(width, height) say("[WINDOW_SIZE width;"..width.."|height;"..height.."]") end function setmapcenterposition(x,y) raw_script("[SETCMAPPOS x;") raw_script(x.."|y;") raw_script(y.."]") end function say_item(name, vnum, desc) say("[INSERT_IMAGE image_type;item|idx;"..vnum.."|title;"..name.."|desc;"..desc.."]") end function say_item_vnum(vnum) say_item(item_name(vnum), vnum, "") end function setvarchar(name, var) local laenge = string.len (var) local setchar = 0 local save_name = 0 local letter = 0 while laenge > setchar do setchar = setchar + 1 letter = string.sub (var, setchar, setchar) letter = string.byte(letter, 1) save_name = ""..name.."_char_"..setchar.."" pc.setqf(save_name, letter) end local save_laenge=""..name.."laenge" pc.setqf(save_laenge, laenge) end function getvarchar(name) local save_laenge = ""..name.."laenge" local laenge = pc.getqf(save_laenge) local save_name = 0 local var = "" local letter = 0 local getchar = 0 while laenge > getchar do getchar = getchar + 1 save_name = ""..name.."_char_"..getchar.."" letter = pc.getqf(save_name) if letter!=0 then letter = string.char(letter) else letter = "" end var = ""..var..""..letter.."" end return var end function delvarchar(name) local save_laenge = ""..name.."laenge" local laenge = pc.getqf(save_laenge) local getchar = 0 while laenge > getchar do getchar = getchar + 1 local save_name = ""..name.."_char_"..getchar.."" pc.delqf(save_name) end pc.delqf(save_laenge) end function global_setvarchar(name, var) local laenge = string.len (var) local setchar = 0 local save_name = 0 local letter = 0 while laenge > setchar do setchar = setchar + 1 letter = string.sub (var, setchar, setchar) letter = string.byte(letter) if letter==91 or letter==93 then letter=32 end save_name = ""..name.."_char_"..setchar.."" game.set_event_flag(save_name, letter) end local save_laenge=""..name.."laenge" game.set_event_flag(save_laenge, laenge) end function global_getvarchar(name) local save_laenge = ""..name.."laenge" local laenge = game.get_event_flag(save_laenge) local save_name = 0 local var = "" local letter = 0 local getchar = 0 while laenge > getchar do getchar = getchar + 1 save_name = ""..name.."_char_"..getchar.."" letter = game.get_event_flag(save_name) if letter!=0 then letter = string.char(letter) else letter = "" end var = ""..var..""..letter.."" end return var end function pc_is_novice() if pc.get_skill_group()==0 then return true else return false end end function pc_get_exp_bonus(exp, text) say_reward(text) pc.give_exp2(exp) set_quest_state("levelup", "run") end function pc_get_village_map_index(index) return village_map[pc.get_empire()][index] end village_map = { {1, 3}, {21, 23}, {41, 43}, } function npc_is_same_empire() if pc.get_empire()==npc.empire then return true else return false end end function npc_get_skill_teacher_race(pc_empire, pc_job, sub_job) if 1==sub_job then if 0==pc_job then return WARRIOR1_NPC_LIST[pc_empire] elseif 1==pc_job then return ASSASSIN1_NPC_LIST[pc_empire] elseif 2==pc_job then return SURA1_NPC_LIST[pc_empire] elseif 3==pc_job then return SHAMAN1_NPC_LIST[pc_empire] end elseif 2==sub_job then if 0==pc_job then return WARRIOR2_NPC_LIST[pc_empire] elseif 1==pc_job then return ASSASSIN2_NPC_LIST[pc_empire] elseif 2==pc_job then return SURA2_NPC_LIST[pc_empire] elseif 3==pc_job then return SHAMAN2_NPC_LIST[pc_empire] end end return 0 end function pc_find_square_guard_vid() if pc.get_empire()==1 then return find_npc_by_vnum(11000) elseif pc.get_empire()==2 then return find_npc_by_vnum(11002) elseif pc.get_empire()==3 then return find_npc_by_vnum(11004) end return 0 end function pc_find_skill_teacher_vid(sub_job) local vnum=npc_get_skill_teacher_race(pc.get_empire(), pc.get_job(), sub_job) return find_npc_by_vnum(vnum) end function pc_find_square_guard_vid() local pc_empire=pc.get_empire() if pc_empire==1 then return find_npc_by_vnum(11000) elseif pc_empire==2 then return find_npc_by_vnum(11002) elseif pc_empire==3 then return find_npc_by_vnum(11004) end end function npc_is_same_job() local pc_job=pc.get_job() local npc_vnum=npc.get_race() -- test_chat("pc.job:"..pc.get_job()) -- test_chat("npc_race:"..npc.get_race()) -- test_chat("pc.skill_group:"..pc.get_skill_group()) if pc_job==0 then if table_is_in(WARRIOR1_NPC_LIST, npc_vnum) then return true end if table_is_in(WARRIOR2_NPC_LIST, npc_vnum) then return true end elseif pc_job==1 then if table_is_in(ASSASSIN1_NPC_LIST, npc_vnum) then return true end if table_is_in(ASSASSIN2_NPC_LIST, npc_vnum) then return true end elseif pc_job==2 then if table_is_in(SURA1_NPC_LIST, npc_vnum) then return true end if table_is_in(SURA2_NPC_LIST, npc_vnum) then return true end elseif pc_job==3 then if table_is_in(SHAMAN1_NPC_LIST, npc_vnum) then return true end if table_is_in(SHAMAN2_NPC_LIST, npc_vnum) then return true end end return false end function npc_get_job() local npc_vnum=npc.get_race() if table_is_in(WARRIOR1_NPC_LIST, npc_vnum) then return COND_WARRIOR_1 end if table_is_in(WARRIOR2_NPC_LIST, npc_vnum) then return COND_WARRIOR_2 end if table_is_in(ASSASSIN1_NPC_LIST, npc_vnum) then return COND_ASSASSIN_1 end if table_is_in(ASSASSIN2_NPC_LIST, npc_vnum) then return COND_ASSASSIN_2 end if table_is_in(SURA1_NPC_LIST, npc_vnum) then return COND_SURA_1 end if table_is_in(SURA2_NPC_LIST, npc_vnum) then return COND_SURA_2 end if table_is_in(SHAMAN1_NPC_LIST, npc_vnum) then return COND_SHAMAN_1 end if table_is_in(SHAMAN2_NPC_LIST, npc_vnum) then return COND_SHAMAN_2 end return 0 end function time_min_to_sec(value) return 60*value end function time_hour_to_sec(value) return 3600*value end function next_time_set(value, test_value) local nextTime=get_time()+value if is_test_server() then nextTime=get_time()+test_value end pc.setqf("__NEXT_TIME__", nextTime) end function next_time_is_now(value) if get_time()>=pc.getqf("__NEXT_TIME__") then return true else return false end end function table_get_random_item(self) return self[number(1, table.getn(self))] end function table_is_in(self, test) for i = 1, table.getn(self) do if self[i]==test then return true end end return false end function giveup_quest_menu(title) local s=select("진행한다", "포기한다") if 2==s then say(title.." 퀘스트를 정말로") say("포기하시겠습니까?") local s=select("네, 그렇습니다", "아닙니다") if 1==s then say(title.."퀘스트를 포기했습니다") restart_quest() end end end function restart_quest() set_state("start") q.done() end function complete_quest() set_state("__COMPLETE__") q.done() end function giveup_quest() set_state("__GIVEUP__") q.done() end function complete_quest_state(state_name) set_state(state_name) q.done() end function test_chat(log) if is_test_server() then chat(log) end end function bool_to_str(is) if is then return "true" else return "false" end end WARRIOR1_NPC_LIST = {20300, 20320, 20340, } WARRIOR2_NPC_LIST = {20301, 20321, 20341, } ASSASSIN1_NPC_LIST = {20302, 20322, 20342, } ASSASSIN2_NPC_LIST = {20303, 20323, 20343, } SURA1_NPC_LIST = {20304, 20324, 20344, } SURA2_NPC_LIST = {20305, 20325, 20345, } SHAMAN1_NPC_LIST = {20306, 20326, 20346, } SHAMAN2_NPC_LIST = {20307, 20327, 20347, } function skill_group_dialog(e, j, g) -- e = 제국, j = 직업, g = 그룹 e = 1 -- XXX 메시지가 나라별로 있다가 하나로 통합되었음 -- 다른 직업이거나 다른 제국일 경우 if pc.job != j then say(locale.skill_group.dialog[e][pc.job][3]) elseif pc.get_skill_group() == 0 then if pc.level < 5 then say(locale.skill_group.dialog[e][j][g][1]) return end say(locale.skill_group.dialog[e][j][g][2]) local answer = select(locale.yes, locale.no) if answer == 1 then --say(locale.skill_group.dialog[e][j][g][2]) pc.set_skill_group(g) else --say(locale.skill_group.dialog[e][j][g][3]) end --elseif pc.get_skill_group() == g then --say(locale.skill_group.dialog[e][j][g][4]) --else --say(locale.skill_group.dialog[e][j][g][5]) end end function show_horse_menu() if horse.is_mine() then say(locale.horse_menu.menu) local s = 0 if horse.is_dead() then s = select(locale.horse_menu.revive, locale.horse_menu.ride, locale.horse_menu.unsummon, locale.horse_menu.close) else s = select(locale.horse_menu.feed, locale.horse_menu.ride, locale.horse_menu.unsummon, locale.horse_menu.close) end if s==1 then if horse.is_dead() then horse.revive() else local food = horse.get_grade() + 50054 - 1 if pc.countitem(food) > 0 then pc.removeitem(food, 1) horse.feed() else say(locale.need_item_prefix..item_name(food)..locale.need_item_postfix); end end elseif s==2 then horse.ride() elseif s==3 then horse.unsummon() elseif s==4 then -- do nothing end end end npc_index_table = { ['race'] = npc.getrace, ['empire'] = npc.get_empire, } pc_index_table = { ['weapon'] = pc.getweapon, ['level'] = pc.get_level, ['hp'] = pc.gethp, ['maxhp'] = pc.getmaxhp, ['sp'] = pc.getsp, ['maxsp'] = pc.getmaxsp, ['exp'] = pc.get_exp, ['nextexp'] = pc.get_next_exp, ['job'] = pc.get_job, ['money'] = pc.getmoney, ['gold'] = pc.getmoney, ['name'] = pc.getname, ['playtime'] = pc.getplaytime, ['leadership'] = pc.getleadership, ['empire'] = pc.getempire, ['skillgroup'] = pc.get_skill_group, ['x'] = pc.getx, ['y'] = pc.gety, ['local_x'] = pc.get_local_x, ['local_y'] = pc.get_local_y, } item_index_table = { ['vnum'] = item.get_vnum, ['name'] = item.get_name, ['size'] = item.get_size, ['count'] = item.get_count, ['type'] = item.get_type, ['sub_type'] = item.get_sub_type, ['refine_vnum'] = item.get_refine_vnum, ['level'] = item.get_level, } guild_war_bet_price_table = { 10000, 30000, 50000, 100000 } function npc_index(t,i) local npit = npc_index_table if npit[i] then return npit[i]() else return rawget(t,i) end end function pc_index(t,i) local pit = pc_index_table if pit[i] then return pit[i]() else return rawget(t,i) end end function item_index(t, i) local iit = item_index_table if iit[i] then return iit[i]() else return rawget(t, i) end end setmetatable(pc,{__index=pc_index}) setmetatable(npc,{__index=npc_index}) setmetatable(item,{__index=item_index}) --coroutine을 이용한 선택항 처리 function select(...) return q.yield('select', arg) end function select_table(table) return q.yield('select', table) end -- coroutine을 이용한 다음 엔터 기다리기 function wait() q.yield('wait') end function input() return q.yield('input') end function confirm(vid, msg, timeout) return q.yield('confirm', vid, msg, timeout) end function select_item() setskin(NOWINDOW) return q.yield('select_item') end --전역 변수 접근과 관련된 계열 NOWINDOW = 0 NORMAL = 1 CINEMATIC = 2 SCROLL = 3 WARRIOR = 0 ASSASSIN = 1 SURA = 2 SHAMAN = 3 COND_WARRIOR_0 = 8 COND_WARRIOR_1 = 16 COND_WARRIOR_2 = 32 COND_WARRIOR = 56 COND_ASSASSIN_0 = 64 COND_ASSASSIN_1 = 128 COND_ASSASSIN_2 = 256 COND_ASSASSIN = 448 COND_SURA_0 = 512 COND_SURA_1 = 1024 COND_SURA_2 = 2048 COND_SURA = 3584 COND_SHAMAN_0 = 4096 COND_SHAMAN_1 = 8192 COND_SHAMAN_2 = 16384 COND_SHAMAN = 28672 PART_MAIN = 0 PART_HAIR = 3 GUILD_CREATE_ITEM_VNUM = 70101 QUEST_SCROLL_TYPE_KILL_MOB = 1 QUEST_SCROLL_TYPE_KILL_ANOTHER_EMPIRE = 2 apply = { ["MAX_HP"] = 1, ["MAX_SP"] = 2, ["CON"] = 3, ["INT"] = 4, ["STR"] = 5, ["DEX"] = 6, ["ATT_SPEED"] = 7, ["MOV_SPEED"] = 8, ["CAST_SPEED"] = 9, ["HP_REGEN"] = 10, ["SP_REGEN"] = 11, ["POISON_PCT"] = 12, ["STUN_PCT"] = 13, ["SLOW_PCT"] = 14, ["CRITICAL_PCT"] = 15, ["PENETRATE_PCT"] = 16, ["ATTBONUS_HUMAN"] = 17, ["ATTBONUS_ANIMAL"] = 18, ["ATTBONUS_ORC"] = 19, ["ATTBONUS_MILGYO"] = 20, ["ATTBONUS_UNDEAD"] = 21, ["ATTBONUS_DEVIL"] = 22, ["STEAL_HP"] = 23, ["STEAL_SP"] = 24, ["MANA_BURN_PCT"] = 25, ["DAMAGE_SP_RECOVER"] = 26, ["BLOCK"] = 27, ["DODGE"] = 28, ["RESIST_SWORD"] = 29, ["RESIST_TWOHAND"] = 30, ["RESIST_DAGGER"] = 31, ["RESIST_BELL"] = 32, ["RESIST_FAN"] = 33, ["RESIST_BOW"] = 34, ["RESIST_FIRE"] = 35, ["RESIST_ELEC"] = 36, ["RESIST_MAGIC"] = 37, ["RESIST_WIND"] = 38, ["REFLECT_MELEE"] = 39, ["REFLECT_CURSE"] = 40, ["POISON_REDUCE"] = 41, ["KILL_SP_RECOVER"] = 42, ["EXP_DOUBLE_BONUS"] = 43, ["GOLD_DOUBLE_BONUS"] = 44, ["ITEM_DROP_BONUS"] = 45, ["POTION_BONUS"] = 46, ["KILL_HP_RECOVER"] = 47, ["IMMUNE_STUN"] = 48, ["IMMUNE_SLOW"] = 49, ["IMMUNE_FALL"] = 50, ["SKILL"] = 51, ["BOW_DISTANCE"] = 52, ["ATT_GRADE_BONUS"] = 53, ["DEF_GRADE_BONUS"] = 54, ["MAGIC_ATT_GRADE"] = 55, ["MAGIC_DEF_GRADE"] = 56, ["CURSE_PCT"] = 57, ["MAX_STAMINA"] = 58, ["ATTBONUS_WARRIOR"] = 59, ["ATTBONUS_ASSASSIN"] = 60, ["ATTBONUS_SURA"] = 61, ["ATTBONUS_SHAMAN"] = 62, ["ATTBONUS_MONSTER"] = 63, } -- 레벨업 퀘스트 -_- special = {} special.fortune_telling = { -- { prob 크리 item money remove money { 1, 0, 20, 20, 0 }, -- 10 { 499, 0, 10, 10, 0 }, -- 5 { 2500, 0, 5, 5, 0 }, -- 1 { 5000, 0, 0, 0, 0 }, { 1500, 0, -5, -5, 20000 }, { 499, 0, -10, -10, 20000 }, { 1, 0, -20, -20, 20000 }, } special.questscroll_reward = { {1, 1500, 3000, 30027, 0, 0 }, {2, 1500, 3000, 30028, 0, 0 }, {3, 1000, 2000, 30034, 30018, 0 }, {4, 1000, 2000, 30034, 30011, 0 }, {5, 1000, 2000, 30011, 30034, 0 }, {6, 1000, 2000, 27400, 0, 0 }, {7, 2000, 4000, 30023, 30003, 0 }, {8, 2000, 4000, 30005, 30033, 0 }, {9, 2000, 8000, 30033, 30005, 0 }, {10, 4000, 8000, 30021, 30033, 30045}, {11, 4000, 8000, 30045, 30022, 30046}, {12, 5000, 12000, 30047, 30045, 30055}, {13, 5000, 12000, 30051, 30017, 30058}, {14, 5000, 12000, 30051, 30007, 30041}, {15, 5000, 15000, 30091, 30017, 30018}, {16, 3500, 6500, 30021, 30033, 0 }, {17, 4000, 9000, 30051, 30033, 0 }, {18, 4500, 10000, 30056, 30057, 30058}, {19, 4500, 10000, 30059, 30058, 30041}, {20, 5000, 15000, 0, 0, 0 }, } special.active_skill_list = { { { 1, 2, 3, 4, 5}, { 16, 17, 18, 19, 20}, }, { {31, 32, 33, 34, 35}, {46, 47, 48, 49, 50}, }, { {61, 62, 63, 64, 65, 66}, {76, 77, 78, 79, 80, 81}, }, { {91, 92, 93, 94, 95, 96}, {106, 107, 108, 109, 110, 111}, }, } special.skill_reset_cost = { 2000, 2000, 2000, 2000, 2000, 2000, 4000, 6000, 8000, 10000, 14000, 18000, 22000, 28000, 34000, 41000, 50000, 59000, 70000, 90000, 101000, 109000, 114000, 120000, 131000, 141000, 157000, 176000, 188000, 200000, 225000, 270000, 314000, 348000, 393000, 427000, 470000, 504000, 554000, 600000, 758000, 936000, 1103000, 1276000, 1407000, 1568000, 1704000, 1860000, 2080000, 2300000, 2700000, 3100000, 3500000, 3900000, 4300000, 4800000, 5300000, 5800000, 6400000, 7000000, 8000000, 9000000, 10000000, 11000000, 12000000, 13000000, 14000000, 15000000, 16000000, 17000000, } special.levelup_img = { [101] = "dog.tga", [102] = "wolf.tga", [103] = "wolf.tga", [104] = "wolf.tga", [105] = "wolf.tga", [105] = "wolf.tga", [106] = "wolf.tga", [107] = "wolf.tga", [108] = "wild_boar.tga", [109] = "wild_boar.tga", [110] = "bear.tga", [111] = "bear.tga", [112] = "bear.tga", [113] = "bear.tga", [114] = "tiger.tga", [115] = "tiger.tga", [301] = "bak_inf.tga", [302] = "bak_gung.tga", [303] = "bak_gen1.tga", [304] = "bak_gen2.tga", [401] = "huk_inf.tga", [402] = "huk_dol.tga", [403] = "huk_gen1.tga", [404] = "huk_gen2.tga", [501] = "o_inf.tga", [502] = "o_jol.tga", [503] = "o_gung.tga", [504] = "o_jang.tga", [601] = "ung_inf.tga", [602] = "ung_chuk.tga", [603] = "ung_tu.tga", [701] = "mil_chu.tga", [702] = "mil_na.tga", [703] = "mil_na.tga", [704] = "mil_na.tga", [735] = "mil_jip.tga", [901] = "sigwi.tga", [903] = "gwoijil.tga", [2001] = "spider.tga", [2002] = "spider.tga", [2003] = "spider.tga", [2004] = "spider.tga", [2005] = "spider.tga", [2102] = "2102.tga", [2103] = "2103.tga", } special.levelup_quest = { -- monster kill monster kill -- vnum qty. vnum qty. exp percent { 0 , 0 , 0 , 0 , 0 } , -- lev 1 { 101 , 10 , 102 , 5 , 10 } , -- lev 2 { 101 , 20 , 102 , 10 , 10 } , -- lev 3 { 102 , 15 , 103 , 5 , 10 } , -- lev 4 { 103 , 10 , 104 , 10 , 10 } , -- lev 5 { 104 , 20 , 108 , 10 , 10 } , -- lev 6 { 108 , 10 , 105 , 5 , 10 } , -- lev 7 { 108 , 20 , 105 , 10 , 10 } , -- lev 8 { 105 , 15 , 109 , 5 , 10 } , -- lev 9 { 105 , 20 , 109 , 10 , 10 } , -- lev 10 { 109 , 10 , 110 , 5 , 10 } , -- lev 11 { 110 , 15 , 106 , 10 , 10 } , -- lev 12 { 106 , 20 , 111 , 5 , 10 } , -- lev 13 { 111 , 15 , 107 , 5 , 10 } , -- lev 14 { 111 , 20 , 107 , 10 , 10 } , -- lev 15 { 107 , 15 , 114 , 5 , 10 } , -- lev 16 { 107 , 20 , 114 , 10 , 10 } , -- lev 17 { 114 , 10 , 112 , 10 , 10 } , -- lev 18 { 112 , 20 , 113 , 10 , 10 } , -- lev 19 { 113 , 20 , 302 , 15 , 10 } , -- lev 20 { 302 , 20 , 115 , 10 , "2-10" } , -- lev 21 { 115 , 25 , 304 , 10 , "2-10" } , -- lev 22 { 304 , 20 , 401 , 40 , "2-10" } , -- lev 23 { 401 , 60 , 402 , 80 , "2-10" } , -- lev 24 { 501 , 80 , 404 , 20 , "2-10" } , -- lev 25 { 502 , 80 , 406 , 20 , "2-10" } , -- lev 26 { 406 , 30 , 504 , 20 , "2-10" } , -- lev 27 { 631 , 35 , 504 , 30 , "2-10" } , -- lev 28 { 631 , 40 , 632 , 30 , "2-10" } , -- lev 29 { 632 , 40 , 2102 , 30 , "2-10" } , -- lev 30 { 632 , 50 , 2102 , 45 , "2-5" } , -- lev 31 { 633 , 45 , 2001 , 40 , "2-5" } , -- lev 32 { 701 , 35 , 2103 , 30 , "2-5" } , -- lev 33 { 701 , 40 , 2103 , 40 , "2-5" } , -- lev 34 { 702 , 40 , 2002 , 30 , "2-5" } , -- lev 35 { 704 , 20 , 2106 , 20 , "2-5" } , -- lev 36 { 733 , 30 , 2003 , 20 , "2-5" } , -- lev 37 { 734 , 40 , 2004 , 20 , "2-5" } , -- lev 38 { 706 , 40 , 2005 , 30 , "2-5" } , -- lev 39 { 707 , 40 , 2108 , 20 , "2-5" } , -- lev 40 { 901 , 40 , 5123 , 25 , "2-5" } , -- lev 41 { 902 , 30 , 5123 , 30 , "2-5" } , -- lev 42 { 902 , 40 , 2031 , 35 , "2-5" } , -- lev 43 { 903 , 40 , 2031 , 40 , "2-5" } , -- lev 44 { 731 , 50 , 2032 , 45 , "2-5" } , -- lev 45 { 732 , 30 , 5124 , 30 , "2-5" } , -- lev 46 { 903 , 35 , 5125 , 30 , "2-5" } , -- lev 47 { 904 , 40 , 5125 , 35 , "2-5" } , -- lev 48 { 733 , 40 , 2033 , 45 , "2-5" } , -- lev 49 { 734 , 40 , 5126 , 20 , "2-5" } , -- lev 50 { 735 , 50 , 5126 , 30 , "1-4" } , -- lev 51 { 904 , 45 , 2034 , 45 , "1-4" } , -- lev 52 { 904 , 50 , 2034 , 50 , "1-4" } , -- lev 53 { 736 , 40 , 1001 , 30 , "1-4" } , -- lev 54 { 737 , 40 , 1301 , 35 , "1-4" } , -- lev 55 { 905 , 50 , 1002 , 30 , "1-4" } , -- lev 56 { 905 , 60 , 1002 , 40 , "1-4" } , -- lev 57 { 906 , 45 , 1303 , 40 , "1-4" } , -- lev 58 { 906 , 50 , 1303 , 45 , "1-4" } , -- lev 59 { 907 , 45 , 1003 , 40 , "1-4" } , -- lev 60 } special.levelup_reward1 = { -- warrior assassin sura shaman { 0, 0, 0, 0 }, { 11200, 11400, 11600, 11800 }, -- 갑옷 lev2 { 12200, 12340, 12480, 12620 }, -- 투구 lev3 { 13000, 13000, 13000, 13000 } -- 방패 lev4 } -- levelup_reward1 테이블 크기보다 레벨이 높아지면 아래 -- 테이블을 이용하여 아이템을 준다. special.levelup_reward3 = { -- pct item # item count { 33, 27002, 10 }, -- 25% { 67, 27005, 10 }, -- 25% --{ 75, 27101, 5 }, -- 25% { 100, 27114, 5 }, -- 25% } special.levelup_reward_gold21 = { { 10000, 20 }, { 20000, 50 }, { 40000, 25 }, { 80000, 3 }, { 100000, 2 }, } special.levelup_reward_gold31 = { { 20000, 20 }, { 40000, 40 }, { 60000, 25 }, { 80000, 10 }, { 100000, 5 }, } special.levelup_reward_gold41 = { { 40000, 20 }, { 60000, 40 }, { 80000, 25 }, { 100000, 10 }, { 150000, 5 }, } special.levelup_reward_gold51 = { { 60000, 20 }, { 80000, 40 }, { 100000, 25 }, { 150000, 10 }, { 200000, 5 }, } special.levelup_reward_exp21 = { { 2, 9 }, { 3, 14 }, { 4, 39 }, { 6, 24 }, { 8, 9 }, { 10, 4 }, } special.levelup_reward_exp31 = { { 2, 10 }, { 2.5, 15 }, { 3, 40 }, { 3.5, 25 }, { 4, 8 }, { 4.5, 5 }, { 5, 2 }, } special.levelup_reward_exp41 = { { 2, 10 }, { 2.5, 15 }, { 3, 40 }, { 3.5, 25 }, { 4, 8 }, { 4.5, 5 }, { 5, 2 }, } special.levelup_reward_exp51 = { { 1, 10 }, { 1.5, 15 }, { 2, 40 }, { 2.5, 25 }, { 3, 8 }, { 3.5, 5 }, { 4, 2 }, } special.levelup_reward_item_21 = { -- no couple ring { { 27002, 10 }, { 27005, 10 }, { 27114, 10 } }, -- lev 21 { 15080, 15100, 15120, 15140 }, -- lev 22 { 16080, 16100, 16120, 16140 }, -- lev 23 { 17080, 17100, 17120, 17140 }, -- lev 24 { { 27002, 10 }, { 27005, 10 }, { 27114, 10 } }, -- lev 25 { { 27003, 20 }, { 27006, 20 }, { 27114, 10 } }, -- over lev 25 -- with couple ring -- { { 27002, 10 }, { 27005, 10 }, { 27114, 10 }, { 70301, 1 } }, -- lev 21 -- { 15080, 15100, 15120, 15140, 70301 }, -- lev 22 -- { 16080, 16100, 16120, 16140, 70301 }, -- lev 23 -- { 17080, 17100, 17120, 17140, 70301 }, -- lev 24 -- { { 27002, 10 }, { 27005, 10 }, { 27114, 10 }, { 70301, 1 } }, -- lev 25 -- { { 27003, 20 }, { 27006, 20 }, { 27114, 10 } }, -- over lev 25 } special.warp_to_pos = { -- 승룡곡 { { 402100, 673900 }, { 270400, 739900 }, { 321300, 808000 }, }, --도염화지 { --A 5994 7563 --B 5978 6222 --C 7307 6898 { 599400, 756300 }, { 597800, 622200 }, { 730700, 689800 }, }, --영비사막 { --A 2178 6272 { 217800, 627200 }, --B 2219 5027 { 221900, 502700 }, --C 3440 5025 { 344000, 502500 }, }, --서한산 { --A 4342 2906 { 434200, 290600 }, --B 3752 1749 { 375200, 174900 }, --C 4918 1736 { 491800, 173600 }, }, } special.devil_tower = { --{ 123, 608 }, { 2048+126, 6656+384 }, { 2048+134, 6656+147 }, { 2048+369, 6656+629 }, { 2048+369, 6656+401 }, { 2048+374, 6656+167 }, { 2048+579, 6656+616 }, { 2048+578, 6656+392 }, { 2048+575, 6656+148 }, } special.lvq_map = { { -- "A1" 1 {}, { { 440, 565 }, { 460, 771 }, { 668, 800 },}, { { 440, 565 }, { 460, 771 }, { 668, 800 },}, { { 440, 565 }, { 460, 771 }, { 668, 800 },}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{853,557}, {845,780}, {910,956},}, {{853,557}, {845,780}, {910,956},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{224,395}, {137,894}, {206,830}, {266,1067},}, {{224,395}, {137,894}, {206,830}, {266,1067},}, {{224,395}, {137,894}, {206,830}, {266,1067},}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, }, { -- "A2" 2 {}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{244,1309}, {4567,1080}, {496,885}, {798,975}, {1059,1099}, {855,1351},}, {{244,1309}, {4567,1080}, {496,885}, {798,975}, {1059,1099}, {855,1351},}, {{244,1309}, {4567,1080}, {496,885}, {798,975}, {1059,1099}, {855,1351},}, {{244,1309}, {4567,1080}, {496,885}, {798,975}, {1059,1099}, {855,1351},}, {{193,772}, {390,402}, {768,600}, {1075,789}, {1338,813},}, {{193,772}, {390,402}, {768,600}, {1075,789}, {1338,813},}, }, { -- "A3" 3 {}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{438, 895}, {725, 864}, {632, 671},}, {{438, 895}, {725, 864}, {632, 671},}, {{438, 895}, {725, 864}, {632, 671},}, {{438, 895}, {725, 864}, {632, 671},}, {{438, 895}, {725, 864}, {632, 671},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{200,277}, {130,646}, {211,638}, {291,851},}, {{200,277}, {130,646}, {211,638}, {291,851},}, {{200,277}, {130,646}, {211,638}, {291,851},}, {{100,150}}, {{100,150}}, {{100,150}}, {{100,150}}, {{100,150}}, {{100,150}}, }, {}, -- 4 {}, -- 5 {}, -- 6 {}, -- 7 {}, -- 8 {}, -- 9 {}, -- 10 {}, -- 11 {}, -- 12 {}, -- 13 {}, -- 14 {}, -- 15 {}, -- 16 {}, -- 17 {}, -- 18 {}, -- 19 {}, -- 20 { -- "B1" 21 {}, {{412,635}, {629,428}, {829,586},}, {{412,635}, {629,428}, {829,586},}, {{412,635}, {629,428}, {829,586},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{866,822}, {706,224}, {247,722},}, {{866,822}, {706,224}, {247,722},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{496,1089}, {890,1043},}, {{496,1089}, {890,1043},}, {{496,1089}, {890,1043},}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{908,87}}, {{908,87}}, {{908,87}}, {{908,87}}, {{908,87}}, {{908,87}}, }, { -- "B2" 22 {}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{ 172,810}, {288,465}, {475,841}, {303,156}, {687,466},}, {{ 172,810}, {288,465}, {475,841}, {303,156}, {687,466},}, {{ 172,810}, {288,465}, {475,841}, {303,156}, {687,466},}, {{ 172,810}, {288,465}, {475,841}, {303,156}, {687,466},}, {{787,235}, {1209,382}, {1350,571}, {1240,852}, {1254,1126}, {1078,1285}, {727,1360},}, {{787,235}, {1209,382}, {1350,571}, {1240,852}, {1254,1126}, {1078,1285}, {727,1360},}, }, { -- "B3" 23 {}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{230, 244}, {200, 444}, {594, 408},}, {{230, 244}, {200, 444}, {594, 408},}, {{230, 244}, {200, 444}, {594, 408},}, {{230, 244}, {200, 444}, {594, 408},}, {{230, 244}, {200, 444}, {594, 408},}, {{584,204}, {720,376}, {861,272},}, {{584,204}, {720,376}, {861,272},}, {{584,204}, {720,376}, {861,272},}, {{584,204}, {720,376}, {861,272},}, {{584,204}, {720,376}, {861,272},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{816,721}, {489,823},}, {{816,721}, {489,823},}, {{816,721}, {489,823},}, {{772,140}}, {{772,140}}, {{772,140}}, {{772,140}}, {{772,140}}, {{772,140}}, }, {}, -- 24 {}, -- 25 {}, -- 26 {}, -- 27 {}, -- 28 {}, -- 29 {}, -- 30 {}, -- 31 {}, -- 32 {}, -- 33 {}, -- 34 {}, -- 35 {}, -- 36 {}, -- 37 {}, -- 38 {}, -- 39 {}, -- 40 { -- "C1" 41 {}, {{385,446}, {169,592}, {211,692}, {632,681},}, {{385,446}, {169,592}, {211,692}, {632,681},}, {{385,446}, {169,592}, {211,692}, {632,681},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{169,362}, {368,304}, {626,409}, {187,882}, {571,858},}, {{169,362}, {368,304}, {626,409}, {187,882}, {571,858},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{452,160}, {536,1034}, {184,1044},}, {{452,160}, {536,1034}, {184,1044},}, {{452,160}, {536,1034}, {184,1044},}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, }, { -- "C2" 42 {}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{991,222}, {1201,525}, {613,232}, {970,751}, {1324,790},}, {{991,222}, {1201,525}, {613,232}, {970,751}, {1324,790},}, {{991,222}, {1201,525}, {613,232}, {970,751}, {1324,790},}, {{991,222}, {1201,525}, {613,232}, {970,751}, {1324,790},}, {{192,211}, {247,600}, {249,882}, {987,981}, {1018,1288}, {1303,1174},}, {{192,211}, {247,600}, {249,882}, {987,981}, {1018,1288}, {1303,1174},}, }, { -- "C3" 43 {}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{421, 189}, {167, 353},}, {{421, 189}, {167, 353},}, {{421, 189}, {167, 353},}, {{421, 189}, {167, 353},}, {{421, 189}, {167, 353},}, {{679,459}, {505,709},}, {{679,459}, {505,709},}, {{679,459}, {505,709},}, {{679,459}, {505,709},}, {{679,459}, {505,709},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{635,856}, {324,855},}, {{635,856}, {324,855},}, {{635,856}, {324,855},}, {{136,899}}, {{136,899}}, {{136,899}}, {{136,899}}, {{136,899}}, {{136,899}}, }, {}, -- 44 {}, -- 45 {}, -- 46 {}, -- 47 {}, -- 48 {}, -- 49 {}, -- 50 {}, -- 51 {}, -- 52 {}, -- 53 {}, -- 54 {}, -- 55 {}, -- 56 {}, -- 57 {}, -- 58 {}, -- 59 {}, -- 60 } function BuildSkillList(job, group) local skill_vnum_list = {} local skill_name_list = {} if pc.get_skill_group() != 0 then local skill_list = special.active_skill_list[job+1][group] table.foreachi( skill_list, function(i, t) local lev = pc.get_skill_level(t) if lev > 0 then local name = locale.GM_SKILL_NAME_DICT[t] if name != nil then table.insert(skill_vnum_list, t) table.insert(skill_name_list, name) end end end ) end table.insert(skill_vnum_list, 0) table.insert(skill_name_list, locale.cancel) return { skill_vnum_list, skill_name_list } end PREMIUM_EXP = 0 PREMIUM_ITEM = 1 PREMIUM_SAFEBOX = 2 PREMIUM_AUTOLOOT = 3 PREMIUM_FISH_MIND = 4 PREMIUM_MARRIAGE_FAST = 5 PREMIUM_GOLD = 6 -- point type start POINT_NONE = 0 POINT_LEVEL = 1 POINT_VOICE = 2 POINT_EXP = 3 POINT_NEXT_EXP = 4 POINT_HP = 5 POINT_MAX_HP = 6 POINT_SP = 7 POINT_MAX_SP = 8 POINT_STAMINA = 9 --스테미너 POINT_MAX_STAMINA = 10 --최대 스테미너 POINT_GOLD = 11 POINT_ST = 12 --근력 POINT_HT = 13 --체력 POINT_DX = 14 --민첩성 POINT_IQ = 15 --정신력 POINT_DEF_GRADE = 16 POINT_ATT_SPEED = 17 --공격속도 POINT_ATT_GRADE = 18 --공격력 MAX POINT_MOV_SPEED = 19 --이동속도 POINT_CLIENT_DEF_GRADE = 20 --방어등급 POINT_CASTING_SPEED = 21 --주문속도 (쿨다운타임*100) / (100 + 이값) = 최종 쿨다운 타임 POINT_MAGIC_ATT_GRADE = 22 --마법공격력 POINT_MAGIC_DEF_GRADE = 23 --마법방어력 POINT_EMPIRE_POINT = 24 --제국점수 POINT_LEVEL_STEP = 25 --한 레벨에서의 단계.. (1 2 3 될 때 보상 4 되면 레벨 업) POINT_STAT = 26 --능력치 올릴 수 있는 개수 POINT_SUB_SKILL = 27 --보조 스킬 포인트 POINT_SKILL = 28 --액티브 스킬 포인트 POINT_WEAPON_MIN = 29 --무기 최소 데미지 POINT_WEAPON_MAX = 30 --무기 최대 데미지 POINT_PLAYTIME = 31 --플레이시간 POINT_HP_REGEN = 32 --HP 회복률 POINT_SP_REGEN = 33 --SP 회복률 POINT_BOW_DISTANCE = 34 --활 사정거리 증가치 (meter) POINT_HP_RECOVERY = 35 --체력 회복 증가량 POINT_SP_RECOVERY = 36 --정신력 회복 증가량 POINT_POISON_PCT = 37 --독 확률 POINT_STUN_PCT = 38 --기절 확률 POINT_SLOW_PCT = 39 --슬로우 확률 POINT_CRITICAL_PCT = 40 --크리티컬 확률 POINT_PENETRATE_PCT = 41 --관통타격 확률 POINT_CURSE_PCT = 42 --저주 확률 POINT_ATTBONUS_HUMAN = 43 --인간에게 강함 POINT_ATTBONUS_ANIMAL = 44 --동물에게 데미지 % 증가 POINT_ATTBONUS_ORC = 45 --웅귀에게 데미지 % 증가 POINT_ATTBONUS_MILGYO = 46 --밀교에게 데미지 % 증가 POINT_ATTBONUS_UNDEAD = 47 --시체에게 데미지 % 증가 POINT_ATTBONUS_DEVIL = 48 --마귀(악마)에게 데미지 % 증가 POINT_ATTBONUS_INSECT = 49 --벌레족 POINT_ATTBONUS_FIRE = 50 --화염족 POINT_ATTBONUS_ICE = 51 --빙설족 POINT_ATTBONUS_DESERT = 52 --사막족 POINT_ATTBONUS_MONSTER = 53 --모든 몬스터에게 강함 POINT_ATTBONUS_WARRIOR = 54 --무사에게 강함 POINT_ATTBONUS_ASSASSIN = 55 --자객에게 강함 POINT_ATTBONUS_SURA = 56 --수라에게 강함 POINT_ATTBONUS_SHAMAN = 57 --무당에게 강함 -- ADD_TRENT_MONSTER POINT_ATTBONUS_TREE = 58 --나무에게 강함 20050729.myevan UNUSED5 -- END_OF_ADD_TRENT_MONSTER POINT_RESIST_WARRIOR = 59 --무사에게 저항 POINT_RESIST_ASSASSIN = 60 --자객에게 저항 POINT_RESIST_SURA = 61 --수라에게 저항 POINT_RESIST_SHAMAN = 62 --무당에게 저항 POINT_STEAL_HP = 63 --생명력 흡수 POINT_STEAL_SP = 64 --정신력 흡수 POINT_MANA_BURN_PCT = 65 --마나 번 --/ 피해시 보너스 =/ POINT_DAMAGE_SP_RECOVER = 66 --공격당할 시 정신력 회복 확률 POINT_BLOCK = 67 --블럭율 POINT_DODGE = 68 --회피율 POINT_RESIST_SWORD = 69 POINT_RESIST_TWOHAND = 70 POINT_RESIST_DAGGER = 71 POINT_RESIST_BELL = 72 POINT_RESIST_FAN = 73 POINT_RESIST_BOW = 74 --화살 저항 : 대미지 감소 POINT_RESIST_FIRE = 75 --화염 저항 : 화염공격에 대한 대미지 감소 POINT_RESIST_ELEC = 76 --전기 저항 : 전기공격에 대한 대미지 감소 POINT_RESIST_MAGIC = 77 --술법 저항 : 모든술법에 대한 대미지 감소 POINT_RESIST_WIND = 78 --바람 저항 : 바람공격에 대한 대미지 감소 POINT_REFLECT_MELEE = 79 --공격 반사 --/ 특수 피해시 =/ POINT_REFLECT_CURSE = 80 --저주 반사 POINT_POISON_REDUCE = 81 --독데미지 감소 --/ 적 소멸시 =/ POINT_KILL_SP_RECOVER = 82 --적 소멸시 MP 회복 POINT_EXP_DOUBLE_BONUS = 83 POINT_GOLD_DOUBLE_BONUS = 84 POINT_ITEM_DROP_BONUS = 85 --/ 회복 관련 =/ POINT_POTION_BONUS = 86 POINT_KILL_HP_RECOVERY = 87 POINT_IMMUNE_STUN = 88 POINT_IMMUNE_SLOW = 89 POINT_IMMUNE_FALL = 90 --======== POINT_PARTY_ATTACKER_BONUS = 91 POINT_PARTY_TANKER_BONUS = 92 POINT_ATT_BONUS = 93 POINT_DEF_BONUS = 94 POINT_ATT_GRADE_BONUS = 95 POINT_DEF_GRADE_BONUS = 96 POINT_MAGIC_ATT_GRADE_BONUS = 97 POINT_MAGIC_DEF_GRADE_BONUS = 98 POINT_RESIST_NORMAL_DAMAGE = 99 POINT_HIT_HP_RECOVERY = 100 POINT_HIT_SP_RECOVERY = 101 POINT_MANASHIELD = 102 --흑신수호 스킬에 의한 마나쉴드 효과 정도 POINT_PARTY_BUFFER_BONUS = 103 POINT_PARTY_SKILL_MASTER_BONUS = 104 POINT_HP_RECOVER_CONTINUE = 105 POINT_SP_RECOVER_CONTINUE = 106 POINT_STEAL_GOLD = 107 POINT_POLYMORPH = 108 --변신한 몬스터 번호 POINT_MOUNT = 109 --타고있는 몬스터 번호 POINT_PARTY_HASTE_BONUS = 110 POINT_PARTY_DEFENDER_BONUS = 111 POINT_STAT_RESET_COUNT = 112 --피의 단약 사용을 통한 스텟 리셋 포인트 (1당 1포인트 리셋가능) POINT_HORSE_SKILL = 113 POINT_MALL_ATTBONUS = 114 --공격력 +x% POINT_MALL_DEFBONUS = 115 --방어력 +x% POINT_MALL_EXPBONUS = 116 --경험치 +x% POINT_MALL_ITEMBONUS = 117 --아이템 드롭율 x/10배 POINT_MALL_GOLDBONUS = 118 --돈 드롭율 x/10배 POINT_MAX_HP_PCT = 119 --최대생명력 +x% POINT_MAX_SP_PCT = 120 --최대정신력 +x% POINT_SKILL_DAMAGE_BONUS = 121 --스킬 데미지 *(100+x)% POINT_NORMAL_HIT_DAMAGE_BONUS = 122 --평타 데미지 *(100+x)% -- DEFEND_BONUS_ATTRIBUTES POINT_SKILL_DEFEND_BONUS = 123 --스킬 방어 데미지 POINT_NORMAL_HIT_DEFEND_BONUS = 124 --평타 방어 데미지 -- END_OF_DEFEND_BONUS_ATTRIBUTES -- PC_BANG_ITEM_ADD POINT_PC_BANG_EXP_BONUS = 125 --PC방 전용 경험치 보너스 POINT_PC_BANG_DROP_BONUS = 126 --PC방 전용 드롭률 보너스 -- END_PC_BANG_ITEM_ADD -- POINT_MAX_NUM = 128 common/length.h -- point type start function say_blue(name) say(color256(0, 0, 255)..name..color256(0, 0, 255)) end function say_red(name) say(color256(255, 0, 0)..name..color256(255, 0, 0)) end function say_green(name) say(color256(0, 238, 0)..name..color256(0, 238, 0)) end function say_gold(name) say(color256(255, 215, 0)..name..color256(255, 215, 0)) end function say_black(name) say(color256(0, 0, 0)..name..color256(0, 0, 0)) end function say_white(name) say(color256(255, 255, 255)..name..color256(255, 255, 255)) end function say_yellow(name) say(color256(255, 255, 0)..name..color256(255, 255, 0)) end function say_blue2(name) say(color256(0, 206, 209)..name..color256(0, 206, 209)) end function npc.is_metin() local nr = mysql_query("select metin from player.mob_proto where vnum = '"..npc.get_race().."';") if tonumber(nr) == 1 then return true else return false end end function give_dm(z) os.execute("mysql -u root account --execute='UPDATE account SET cash = cash + ".. z .." WHERE id = ".. pc.get_account_id() ..";'") os.execute("mysql -u root log --execute='INSERT INTO voucher_log (account_id, pocet, cas) VALUES (".. pc.get_account_id() ..", ".. z ..", NOW());'") end function setenergy(typ,value,timez) pc.setqf("energy_value", value) pc.setqf("energy_date", get_time() + timez) pc.setqf("energy_typ", typ) end function setenergytime(timez) pc.setqf("energy_date", timez) end function getenergytyp() return pc.getqf("energy_typ") end function getenergyvalue() return pc.getqf("energy_value") end function getenergytime() return pc.getqf("energy_date") end function split(str, delim, maxNb) if str == nil then return str end if string.find(str, delim) == nil then return { str } end if maxNb == nil or maxNb < 1 then maxNb = 0 end local result = {} local pat = "(.-)" .. delim .. "()" local nb = 0 local lastPos for part, pos in string.gfind(str, pat) do nb = nb + 1 result[nb] = part lastPos = pos if nb == maxNb then break end end if nb ~= maxNb then result[nb + 1] = string.sub(str, lastPos) end return result end mysql_query = function(query) if not pre then local rt = io.open('CONFIG','r'):read('*all') pre,_= string.gsub(rt,'.+PLAYER_SQL:%s(%S+)%s(%S+)%s(%S+)%s(%S+).+','-h%1 -u%2 -p%3 -D%4') end math.randomseed(os.time()) local fi,t,out = 'mysql_data_'..math.random(10^9)+math.random(2^4,2^10),{},{} --os.execute('mysql '..pre..' --e='..string.format('%q',query)..' > '..fi) -- f? MySQL51 os.execute('mysql '..pre..' -e'..string.format('%q',query)..' > '..fi) -- f? MySQL55 for av in io.open(fi,'r'):lines() do table.insert(t,split(av,'\t')) end; os.remove(fi); for i = 2, table.getn(t) do table.foreach(t[i],function(a,b) out[i-1] = out[i-1] or {} out[i-1][a] = tonumber(b) or b or 'NULL' out[t[1][a]] = out[t[1][a]] or {} out[t[1][a]][i-1] = tonumber(b) or b or 'NULL' end) end return out end -- Entferne Leerzeichen vor und nach dem String function string.trim(str) return (string.gsub(str, "^%s*(.-)%s*$", "%1")) end -- String zu Array ?er Seperator function string.explode(str, sep) if sep == "" or str == "" then error("Fehlende Parameter") end local pos, t = 1, {} for s, e in function() return string.find(str, sep, pos) end do table.insert(t, string.trim(string.sub(str, pos, s-1))) pos = e+1 end table.insert(t, string.trim(string.sub(str, pos))) return t end dofile("/usr/home/game/quest/cube.lua")
|
In der questlib musst du dafür nichts machen, das ist eine Standardfunktion. Einfach in die quest_functions eintragen.
select3 dürfte jetzt nicht mehr vorkommen (solltest du ja ersetzen)
|
|
|
09/01/2016, 18:20
|
#12403
|
elite*gold: 0
Join Date: Jan 2009
Posts: 21
Received Thanks: 3
|
klappt leider immer noch nicht wenn ich den ring anklicke öffnet sich nur ein verbugtes fenster
|
|
|
09/01/2016, 20:09
|
#12404
|
elite*gold: 83
Join Date: Nov 2013
Posts: 2,891
Received Thanks: 2,764
|
Das liegt daran, dass du in einem select keine eckigen Klammern nutzen darfst.
Wenn du das Min. und Maxlv direkt über die Einstellungen einträgst, wird automatisch das Min. und Maxlv dazugeschrieben.
|
|
|
09/02/2016, 18:55
|
#12405
|
elite*gold: 0
Join Date: Jan 2009
Posts: 21
Received Thanks: 3
|
PHP Code:
quest haustiere begin state start begin -- Setzt den neuen Petnamen in die Datenbank ein function set_pet_name(name) mysql_query("DELETE FROM player.pet_name WHERE id = \\'"..pc.get_player_id().."\\'") mysql_query("INSERT INTO player.pet_name(id, name) VALUES(\\'"..pc.get_player_id().."\\', \\'"..name.."\\')") end -- Holt sich den Petnamen aus der Datenbank function get_pet_name() local pet_name = mysql_query("SELECT * FROM player.pet_name WHERE id = \\'"..pc.get_player_id().."\\'") return (pet_name.name or {pc.get_name().."'s Haustier"})[1] end -- Feuer-Phönix when 53001.use begin if pet.is_summon() then pet.unsummon() chat("Dein Haustier verabschiedet sich nun von dir!") affect.remove_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.MAX_HP, 1000, 60*60*8) else local old_level = horse.get_level() local old_name = horse.get_name() horse.set_level(22) horse.set_name(haustiere.get_pet_name()) pet.summon() horse.set_level(old_level) horse.set_name(old_name) affect.add_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.MAX_HP, 1000, 60*60*8) end end -- Rentierjunges when 53002.use begin if pet.is_summon() then pet.unsummon() chat("Dein Haustier verabschiedet sich nun von dir!") affect.remove_collect(apply.ATT_GRADE_BONUS, 150, 60*60*8) affect.remove_collect(apply.ATT_BONUS_TO_MONSTER, 15, 60*60*8) affect.remove_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.MAX_HP, 1500, 60*60*8) else local old_level = horse.get_level() local old_name = horse.get_name() horse.set_level(24) horse.set_name(haustiere.get_pet_name()) pet.summon() horse.set_level(old_level) horse.set_name(old_name) affect.add_collect(apply.ATT_GRADE_BONUS, 150, 60*60*8) affect.add_collect(apply.ATT_BONUS_TO_MONSTER, 15, 60*60*8) affect.add_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.MAX_HP, 1500, 60*60*8) end end -- Eis-Phönix when 53003.use begin if pet.is_summon() then pet.unsummon() chat("Dein Haustier verabschiedet sich nun von dir!") affect.remove_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.MAX_HP, 1000, 60*60*8) else local old_level = horse.get_level() local old_name = horse.get_name() horse.set_level(23) horse.set_name(haustiere.get_pet_name()) pet.summon() horse.set_level(old_level) horse.set_name(old_name) affect.add_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.MAX_HP, 1000, 60*60*8) end end -- Baby-Azrael when 53005.use begin if pet.is_summon() then pet.unsummon() chat("Dein Haustier verabschiedet sich nun von dir!") affect.remove_collect(apply.ATT_GRADE_BONUS, 150, 60*60*8) affect.remove_collect(apply.ATT_BONUS_TO_MONSTER, 15, 60*60*8) affect.remove_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.MAX_HP, 1500, 60*60*8) else local old_level = horse.get_level() local old_name = horse.get_name() horse.set_level(25) horse.set_name(haustiere.get_pet_name()) pet.summon() horse.set_level(old_level) horse.set_name(old_name) affect.add_collect(apply.ATT_GRADE_BONUS, 150, 60*60*8) affect.add_collect(apply.ATT_BONUS_TO_MONSTER, 15, 60*60*8) affect.add_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.MAX_HP, 1500, 60*60*8) end end -- Baby-Wolfs when 53006.use begin if pet.is_summon() then pet.unsummon() chat("Dein Haustier verabschiedet sich nun von dir!") affect.remove_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.MAX_HP, 1000, 60*60*8) else local old_level = horse.get_level() local old_name = horse.get_name() horse.set_level(26) horse.set_name(haustiere.get_pet_name()) pet.summon() horse.set_level(old_level) horse.set_name(old_name) affect.add_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.MAX_HP, 1000, 60*60*8) end end -- Baby-Löwen when 53007.use begin if pet.is_summon() then pet.unsummon() chat("Dein Haustier verabschiedet sich nun von dir!") affect.remove_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.MAX_HP, 1000, 60*60*8) else local old_level = horse.get_level() local old_name = horse.get_name() horse.set_level(27) horse.set_name(haustiere.get_pet_name()) pet.summon() horse.set_level(old_level) horse.set_name(old_name) affect.add_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.MAX_HP, 1000, 60*60*8) end end -- Baby-Keiler when 53008.use begin if pet.is_summon() then pet.unsummon() chat("Dein Haustier verabschiedet sich nun von dir!") affect.remove_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.MAX_HP, 1000, 60*60*8) else local old_level = horse.get_level() local old_name = horse.get_name() horse.set_level(28) horse.set_name(haustiere.get_pet_name()) pet.summon() horse.set_level(old_level) horse.set_name(old_name) affect.add_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.MAX_HP, 1000, 60*60*8) end end -- Baby-Tiger when 53009.use begin if pet.is_summon() then pet.unsummon() chat("Dein Haustier verabschiedet sich nun von dir!") affect.remove_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.MAX_HP, 1000, 60*60*8) else local old_level = horse.get_level() local old_name = horse.get_name() horse.set_level(29) horse.set_name(haustiere.get_pet_name()) pet.summon() horse.set_level(old_level) horse.set_name(old_name) affect.add_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.MAX_HP, 1000, 60*60*8) end end -- Baby-Leonidas when 53010.use begin if pet.is_summon() then pet.unsummon() chat("Dein Haustier verabschiedet sich nun von dir!") affect.remove_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.MAX_HP, 1000, 60*60*8) else local old_level = horse.get_level() local old_name = horse.get_name() horse.set_level(29) horse.set_name(haustiere.get_pet_name()) pet.summon() horse.set_level(old_level) horse.set_name(old_name) affect.add_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.MAX_HP, 1000, 60*60*8) end end -- Baby-Eisbär when 53014.use begin if pet.is_summon() then pet.unsummon() chat("Dein Haustier verabschiedet sich nun von dir!") affect.remove_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.remove_collect(apply.MAX_HP, 1000, 60*60*8) else local old_level = horse.get_level() local old_name = horse.get_name() horse.set_level(30) horse.set_name(haustiere.get_pet_name()) pet.summon() horse.set_level(old_level) horse.set_name(old_name) affect.add_collect(apply.ATT_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.DEF_GRADE_BONUS, 100, 60*60*8) affect.add_collect(apply.MAX_HP, 1000, 60*60*8) end end -- Namenskette - Namensändung des Haustiers when 71110.use begin say_title("Namenskette :") say("") say("Hier kannst du deinem Haustier einen neuen") say("Namen geben. Damit kannst du dein Haustier") say("über alle anderen hervorheben.") say("") akna = haustiere.get_pet_name() if string.len(akna) == 0 then say_reward("Dein Haustier besitzt bis jetzt keinen Namen.") else say_reward("Der aktuelle Name deines Haustieres lautet: "..akna) end say("") say("Möchtest du fortfahren?") say("") local s=select("Umbenennen", "Abbrechen") if s==2 then return end say_title("Namenskette :") say("") say("Bitte gib hier den neuen Namen deines") say("Haustieres ein.") local x = input() if string.len(x) < 2 then say_title("Namenskette :") say("Der eingegeben Name ist zu kurz.") say("") say_reward("Der neue Name muss aus") say_reward("mind. 2 Zeichen bestehen.") say("") return elseif string.len(x) > 12 then say_title("Namenskette :") say("Der eingegeben Name ist zu lang.") say("") say_reward("Der neue Name darf max.") say_reward("aus 12 Zeichen bestehen.") say("") return end haustiere.set_pet_name(x) chat("Haustier erfolgreich umbenannt") pc.remove_item(71110, 1) end end end
was stimmt mir der quest nicht die pets bringen nicht die dort angezeigten bonis zb will ich das baby azrael 15 monster bringt doch wenn ich den anktiviere mach ich nicht mehr dmg.
PS. danke nochma für die warpring quest funktioniert jetz super =)
|
|
|
All times are GMT +2. The time now is 16:01.
|
|