Member
- May
- Threads
- 0
- 26
- 2
- 3
AD: Mt2009 - Mobile & PC - 30 January 2026 CHECK THE PRESENTATION!
Full Monarch Rework
The World of Metin2 Monarch System is composed of two parts. For the system to work fully you need to use db core 33820 or a compiled db where this bug is solved (look dif part at the end. If anybody wants to create difs for other revisions, you are welcome to do so.)
Monarch Election:
Authors: Musicinstructor and Shogun
Usage: the election has 3 stages: Candidacy, Election and Crowning. All the stages can be started sucessively from the Archer Guardian NPC in town.
- During Candidacy phase, all players over level 65 can apply for election by paying some Yang. Up to 8 players can apply per kingdom.
![]()
- During Election phase, players will drop an item called Certificate of Loyalty (60004) which allows them to cast a vote.
![]()
- Finally, you can finish the election, which will announce the winners automatically.
![]()
The new King / Queen will receive a new Hwang Armor on login and the Angel's Blessing item.
For the quest to work you need the following preparation:
1) Create an empty file share/data/monarch_election in your server with the touch command.
2) Fill the table player.monarch with some random values (use the PID of your GM for example).
You can also use this table:
Code:DROP TABLE IF EXISTS `monarch`; CREATE TABLE `monarch` ( `empire` int(10) unsigned NOT NULL DEFAULT '0', `pid` int(10) unsigned DEFAULT NULL, `windate` datetime DEFAULT NULL, `money` bigint(20) unsigned DEFAULT NULL, PRIMARY KEY (`empire`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- ---------------------------- -- Records of monarch -- ---------------------------- INSERT INTO `monarch` VALUES ('1', '266', '2014-02-04 04:36:55', '0'); INSERT INTO `monarch` VALUES ('2', '188', '2013-11-07 20:10:00', '0'); INSERT INTO `monarch` VALUES ('3', '170', '2013-09-16 22:12:06', '0');
3) Make sure 60004 exists in item proto and has a suitable icon for it.
The quest:
Code:-- World of Metin2 Monarch Election quest quest monarch_election begin state start begin when login or enter begin if oh.ismonarch() > 0 and pc.count_item(70021) == 0 then set_state(newking) elseif oh.ismonarch() == 0 then if pc.count_item(70021) > 0 then pc.remove_item(70021) syschat("Your Angels' Blessing has been removed.") end if pc.count_item(11971) > 0 or pc.count_item(11972) > 0 or pc.count_item(11973) > 0 or pc.count_item(11974) > 0 then if pc.get_part(PART_MAIN) > 11970 and pc.get_part(PART_MAIN) < 11975 then syschat("Please unequip your King Armor and relog.") syschat("You are not allowed to use it anymore.") else local armor = 11971 + pc.get_job() pc.removeitem(armor) syschat("Your Hwang Armor has been removed.") end end end if game.get_event_flag("monarch_elect") > 0 and pc.get_level() >= 40 then send_letter("Monarch Election") end end when button or info begin ----"123456789012345678901234567890123456789012345678901234567890"| addimage(20, 12, "monarch.tga") say("") say("") say("") say("") if game.get_event_flag("monarch_elect") == 1 then say_title("Monarch Candidacy") say("") ----"123456789012345678901234567890123456789012345678901234567890"| say("If you wish to apply to become the next ruler of "..locale.empire_names[pc.get_empire()]..",") say("please talk to the Archer Guardian in any town. Remember") say("you need 1.000.000 Yang and at least level 65 to apply.") say("") say("When the candidacy process ends, you will be able to vote.") elseif game.get_event_flag("monarch_electionid") == pc.getqf("electionid") then say_title("Monarch Election") say("") say("You have already cast your vote. The results will be") say("announced after the election period is finished.") else say_title("Monarch Election") say("") say("Head to the Archer Guardian in any of the towns to cast your") say("vote. In order to prove your citizenship, you will need:") say("") say_item_vnum(60004) say("This item can be obtained fighting enemies.") end say("") end when kill with game.get_event_flag("monarch_elect") > 0 and pc.level >= 45 begin if game.get_event_flag("monarch_electionid") != pc.getqf("electionid") then if not npc.is_pc() then local limit = get_mob_level[npc.get_race()] if limit == nil then return else if pc.get_level() > limit+10 then return end end end if number(1, 500) == 1 then if pc.count_item(60004) == 0 and pc.enough_inventory(60004) then pc.give_item2(60004, 1) syschat("You are now qualified to vote for your monarch.") end end end end when electionman1.chat."GM: Emperor election adjustments" or electionman2.chat."GM: Emperor election adjustments" or electionman3.chat."GM: Emperor election adjustments" with pc.is_gm() begin if game.get_event_flag("monarch_elect") == 1 then say_title("Emperor election:") say("") ----"123456789012345678901234567890123456789012345678901234567890"| say("Currently the candidacies for Monarch Election are open.") say("") say("Shall they be closed now?") say("") local s = select("Close", "Continue" ) if s == 1 then notice_all("King election is starting now!") notice_all("Present your certificates to the Archer Guardian to vote.") game.set_event_flag("monarch_elect", 2) game.set_event_flag("monarch_electionid", get_global_time()) say_title("Emperor election:") say("") say("The applications are closed and players can") say("vote for an emperor now.") say("") end elseif game.get_event_flag("monarch_elect") == 2 then say_title("Emperor election:") say("") say("Currently the election of the new emperors is running.") say("Shall they be ended now?") say("") say_reward("Current standings:") say_reward("Pandemonia: "..monarch_election.getcurrentwinner(1)[1]) say_reward("Asmodia: "..monarch_election.getcurrentwinner(2)[1]) say_reward("Elgoria: "..monarch_election.getcurrentwinner(3)[1]) say("") local s = select("End", "Continue") if s == 1 then notice_all("The Monarch Election has ended now.") game.set_event_flag("monarch_elect", 0) if monarch_election.getcurrentwinner(1)[2] != 0 then mgmt.monarch_change_lord(1, monarch_election.getcurrentwinner(1)[2]) end if monarch_election.getcurrentwinner(2)[2] != 0 then mgmt.monarch_change_lord(2, monarch_election.getcurrentwinner(2)[2]) end if monarch_election.getcurrentwinner(3)[2] != 0 then mgmt.monarch_change_lord(3, monarch_election.getcurrentwinner(3)[2]) end end elseif game.get_event_flag("monarch_elect") == 0 then say_title("Emperor election:") say("") say("Here you can start the Monarch candidacies.") say("") say("Do you want to start them now?") say("") local s = select("Start", "Don't start") if s == 1 then notice_all("The Monarch Candidacy period starts now!") notice_all("Approach the Archer Guardian in town to apply for the election.") game.set_event_flag("monarch_elect", 1) game.set_event_flag("monarch_electionid", get_global_time()) monarch_election.clearcandidacy() end end end when electionman1.chat."Monarch Election" or electionman2.chat."Monarch Election" or electionman3.chat."Monarch Election" with game.get_event_flag("monarch_elect") == 2 begin say_title("Monarch election:") say("") if pc.get_level() < 45 then say("You need at least level 45 to vote. Come back when you") say("become a true citizen.") say("") return end if game.get_event_flag("monarch_electionid") == pc.getqf("electionid") then say("You already voted. You can't vote twice!") say("") return end if pc.count_item(60004) < 1 then say("You need this document in order to prove you are truly") say("a citizen of "..locale.empire_names[pc.get_empire()]..".") say("") say_item_vnum(60004) say("You can get it from any enemy monster or player. Come") say("back when you have obtained it.") say("") return end local gname_table = monarch_election.candidacy_list(pc.get_empire()) if table.getn(gname_table) == 0 then -- no currently war say("There are no candidates!") say("") else table.insert(gname_table, "Cancel") ----"123456789012345678901234567890123456789012345678901234567890"| say("You are qualified to participate. Please vote carefully;") say("you can only do it once.") say("") wait() local s = select_table(gname_table) if s == table.getn(gname_table) then return; else monarch_election.election(s) pc.setqf("electionid", game.get_event_flag("monarch_electionid")) pc.remove_item(60004, 1) say_title("Emperor election:") say("") say("Thank you for participating!") say("") say_reward("You voted for: "..gname_table[s]) say("") end end end when electionman1.chat."Apply for election" or electionman2.chat."Apply for election" or electionman3.chat."Apply for election" with game.get_event_flag("monarch_elect") == 1 begin local NEED_MONEY = 1000000 local NEED_LEVEL = 65 say_title("Monarch election:") say("") say("The following requirements are necessary for a King:") say("") say_reward("1. A candidacy fee of "..NEED_MONEY.." Yang.") say_reward("2. Level "..NEED_LEVEL.." must be reached.") say("") if game.get_event_flag("monarch_elect") == 0 then say("But the election period has not yet started.") say("Return when it has begun.") say("") return end if game.get_event_flag("monarch_electionid") == pc.getqf("electionid") then say("You already applied for this election.") say("") return end say("Do you want to take part in the election?") say("") local s = select("Yes, I want to participate.", "No, thanks.") if s == 1 then say_title("Monarch election:") say("") if monarch_election.candidacycount(pc.get_empire()) >= 8 then say("Sorry, but we already have enough candidates.") say("") say("You can try again in the next election.") elseif pc.get_gold() >= NEED_MONEY and pc.get_level() >= NEED_LEVEL then say("You are now registered for the election.") say("") say("Good Luck!") pc.change_gold(-NEED_MONEY); monarch_election.candidacy(); pc.setqf("electionid", game.get_event_flag("monarch_electionid")) else say("Sorry, you do not fulfill the requirements.") end say("") end end function candidacy() local f = io.open("data/monarch_election", "a+") f:write(pc.get_player_id().."t"..pc.get_empire().."t0t"..pc.get_name().."tn") f:close() end function clearcandidacy() local f = io.open("data/monarch_election", "w+") f:close() end function candidacycount(empire) local count = 0 local f = io.open("data/monarch_election", "r") for line in f:lines() do local e = string.split(line, "t") if e != nil and tonumber(e[2]) == empire then count = count + 1 end end f:close() return count end function candidacy_list(empire) local res = {} local f = io.open("data/monarch_election", "r") for line in f:lines() do cinfo = string.split(line, "t") if tonumber(cinfo[2]) == empire then table.insert(res, cinfo[4]) end end f:close() return res end function election(id) local c_list = {} local c_count = 0 local f = io.open("data/monarch_election", "r") for line in f:lines() do table.insert(c_list, string.split(line, "t")) c_count = c_count + 1 end f:close() f = io.open("data/monarch_election", "w+") local e_i = 1 for i = 1, c_count, 1 do if e_i == id then c_list[i][3] = tonumber(c_list[i][3]) + 1 end if tonumber(c_list[i][2]) == pc.get_empire() then e_i = e_i + 1 end f:write(c_list[i][1].."t"..c_list[i][2].."t"..c_list[i][3].."t"..c_list[i][4].."tn") end f:close() end function getcurrentwinner(empire) local res = {"Nobody", 0} local f = io.open("data/monarch_election", "r") local maxvotes = -1 for line in f:lines() do local exploded = string.split(line, "t") if tonumber(exploded[2]) == empire and tonumber(exploded[3]) > maxvotes then maxvotes = tonumber(exploded[3]) res = {exploded[4], tonumber(exploded[1])} end end f:close() return res end end state newking begin when login or enter begin send_letter("Congratulations!") end when button or info begin local treatment = { [0] = "King", [1] = "Queen", } local armor = 11971 + pc.get_job() ----"123456789012345678901234567890123456789012345678901234567890"| say_title("Congratulations!") say("") say("You have been elected as the "..treatment[pc.get_sex()].." of "..locale.empire_names[pc.get_empire()].."!") say("") say("As a "..treatment[pc.get_sex()]..", you are granted the Hwang Armour and Angel's") say("Blessing items for the duration of your reign.") say("") say("This jewel enables you to use your Monarch powers, but") say("note you will be limited in their use by the Yang available") say("Kingdom's vault, so choose wisely!") say("") say("May your reign be prosper!") say("") clear_letter() set_state(start) if pc.count_item(armor) == 0 then pc.give_item2(armor) end if pc.count_item(70021) == 0 then pc.give_item2(70021) end notice_all("The "..treatment[pc.get_sex()].." "..pc.getname().." of "..locale.empire_names[pc.get_empire()].." has been crowned! All hail the "..treatment[pc.get_sex()].."!") end end end
Add this to locale.lua :
Code:locale.empire_names = { [0] = "All", [1] = "Shinsoo", [2] = "Chunjo", [3] = "Jinno", }
Add this also to questlib.lua :
Code:function string:split(delimiter) local result = {} local from = 1 local delim_from, delim_to = string.find(self, delimiter, from) while delim_from do table.insert(result, string.sub(self, from , delim_from-1)) from = delim_to + 1 delim_from, delim_to = string.find(self, delimiter, from) end table.insert(result, string.sub(self, from)) return result end get_mob_level = { [2051] = 65, [2052] = 67, [2053] = 69, [2054] = 71, [2055] = 73, [11116] = 90, [2061] = 60, [2062] = 62, [2063] = 64, [2064] = 66, [2065] = 68, [2071] = 70, [2072] = 72, [2073] = 74, [2074] = 76, [2075] = 78, [2076] = 78, [11117] = 90, [2091] = 60, [2092] = 79, [2093] = 65, [2094] = 72, [2095] = 70, [2101] = 19, [2102] = 37, [2103] = 39, [2104] = 44, [2105] = 47, [2106] = 48, [2107] = 51, [2108] = 54, [5131] = 22, [2401] = 87, [5132] = 25, [2402] = 89, [5133] = 27, [2131] = 60, [2132] = 62, [2133] = 64, [2134] = 66, [2135] = 68, [101] = 1, [102] = 3, [103] = 4, [2152] = 37, [105] = 9, [106] = 13, [107] = 16, [108] = 7, [109] = 10, [110] = 12, [111] = 15, [112] = 19, [113] = 21, [114] = 18, [115] = 24, [5141] = 35, [131] = 8, [132] = 9, [133] = 11, [134] = 14, [135] = 18, [136] = 21, [137] = 12, [138] = 15, [139] = 17, [140] = 20, [141] = 24, [142] = 26, [143] = 24, [144] = 29, [151] = 9, [152] = 16, [153] = 10, [154] = 21, [2203] = 70, [2204] = 71, [2205] = 72, [2206] = 73, [2207] = 78, [171] = 1, [172] = 3, [173] = 4, [174] = 6, [175] = 9, [2224] = 71, [177] = 16, [178] = 7, [179] = 10, [180] = 12, [181] = 15, [182] = 19, [183] = 21, [184] = 18, [185] = 24, [2234] = 71, [2235] = 72, [191] = 30, [192] = 31, [193] = 33, [194] = 35, [5153] = 49, [5157] = 54, [2291] = 75, [2292] = 99, [2293] = 99, [5161] = 30, [2301] = 65, [2302] = 67, [2303] = 69, [2304] = 70, [2305] = 71, [2306] = 84, [2307] = 86, [2311] = 74, [2312] = 76, [2313] = 77, [2314] = 80, [2315] = 82, [301] = 18, [302] = 20, [303] = 25, [304] = 25, [8501] = 35, [8502] = 30, [8503] = 25, [8504] = 5, [8505] = 10, [8506] = 12, [8507] = 15, [8508] = 20, [8509] = 25, [8510] = 21, [8511] = 11, [331] = 18, [332] = 20, [333] = 25, [334] = 25, [351] = 18, [352] = 20, [353] = 25, [354] = 25, [2403] = 89, [2404] = 90, [2411] = 91, [2412] = 93, [2413] = 95, [2414] = 97, [2451] = 84, [5127] = 54, [2452] = 86, [2431] = 80, [2432] = 82, [2433] = 82, [2434] = 83, [2454] = 90, [391] = 23, [392] = 26, [393] = 28, [394] = 31, [395] = 23, [396] = 26, [397] = 28, [398] = 31, [401] = 26, [402] = 27, [403] = 29, [404] = 30, [405] = 33, [406] = 35, [8600] = 73, [8601] = 86, [8602] = 73, [8603] = 86, [8604] = 73, [8605] = 86, [8606] = 73, [8607] = 86, [8608] = 73, [8609] = 86, [8610] = 73, [8611] = 86, [8612] = 73, [8613] = 86, [8614] = 73, [8615] = 86, [8616] = 86, [11108] = 70, [431] = 31, [432] = 33, [433] = 35, [434] = 36, [435] = 38, [436] = 40, [2491] = 93, [2492] = 95, [2493] = 97, [2494] = 88, [2495] = 90, [451] = 26, [452] = 27, [453] = 29, [454] = 30, [455] = 33, [456] = 35, [2505] = 83, [2506] = 84, [2507] = 85, [2508] = 79, [2509] = 80, [2510] = 81, [2511] = 82, [2512] = 83, [2513] = 84, [2514] = 86, [1175] = 65, [491] = 32, [492] = 37, [493] = 39, [494] = 45, [2543] = 81, [2544] = 82, [2545] = 83, [2546] = 84, [2547] = 86, [501] = 29, [502] = 32, [503] = 35, [504] = 36, [531] = 35, [532] = 37, [533] = 40, [534] = 42, [2591] = 89, [2592] = 89, [2593] = 89, [2594] = 89, [2595] = 89, [2596] = 89, [2597] = 91, [2598] = 91, [551] = 29, [552] = 32, [553] = 35, [554] = 36, [2482] = 92, [2483] = 94, [2484] = 96, [5134] = 29, [591] = 42, [595] = 42, [601] = 26, [602] = 29, [603] = 31, [604] = 33, [2151] = 19, [104] = 6, [631] = 34, [632] = 36, [633] = 39, [634] = 40, [635] = 44, [636] = 46, [637] = 49, [2155] = 47, [2156] = 48, [651] = 34, [652] = 36, [653] = 39, [654] = 40, [2157] = 51, [656] = 46, [657] = 49, [2158] = 54, [2501] = 79, [2502] = 80, [2503] = 81, [5001] = 10, [2504] = 82, [691] = 50, [692] = 55, [693] = 60, [701] = 35, [702] = 38, [703] = 41, [704] = 44, [705] = 48, [706] = 49, [707] = 51, [731] = 52, [732] = 53, [733] = 54, [734] = 54, [735] = 55, [736] = 56, [737] = 57, [751] = 35, [752] = 38, [753] = 41, [754] = 44, [755] = 48, [756] = 49, [757] = 51, [771] = 52, [772] = 53, [773] = 54, [774] = 54, [775] = 55, [776] = 56, [777] = 57, [7050] = 35, [2481] = 91, [791] = 54, [792] = 62, [793] = 64, [794] = 72, [795] = 54, [796] = 62, [7051] = 31, [7001] = 52, [7002] = 53, [2191] = 67, [7004] = 54, [7005] = 55, [7006] = 56, [7007] = 56, [7008] = 52, [2192] = 72, [7010] = 54, [11107] = 70, [7012] = 52, [7013] = 53, [7014] = 54, [7015] = 54, [7016] = 55, [7017] = 56, [7018] = 56, [7019] = 59, [7020] = 59, [7021] = 60, [7022] = 61, [7023] = 62, [7024] = 64, [7025] = 66, [7026] = 67, [7027] = 70, [7028] = 72, [7029] = 35, [7030] = 31, [7031] = 33, [7032] = 35, [7033] = 36, [7034] = 38, [7035] = 40, [7036] = 52, [7037] = 53, [7038] = 54, [7039] = 54, [7040] = 55, [7041] = 56, [7042] = 57, [7043] = 81, [7044] = 81, [901] = 49, [902] = 51, [903] = 53, [904] = 55, [905] = 58, [906] = 58, [907] = 59, [5004] = 80, [5005] = 85, [7054] = 36, [2541] = 79, [7056] = 40, [7057] = 52, [7058] = 53, [7059] = 54, [7060] = 54, [2542] = 80, [7062] = 56, [2201] = 69, [7064] = 81, [7065] = 81, [7066] = 82, [7067] = 83, [7068] = 83, [2202] = 69, [7070] = 85, [7071] = 33, [7072] = 35, [7073] = 36, [7074] = 38, [155] = 24, [932] = 51, [933] = 53, [934] = 55, [935] = 58, [936] = 58, [937] = 59, [7082] = 83, [7083] = 83, [7084] = 84, [7085] = 85, [7086] = 35, [7087] = 36, [7088] = 38, [7089] = 40, [7090] = 54, [7091] = 55, [7092] = 56, [7093] = 57, [7094] = 83, [7095] = 83, [7096] = 84, [7097] = 85, [991] = 59, [992] = 60, [993] = 61, [1001] = 57, [1002] = 58, [1003] = 59, [1004] = 60, [5101] = 22, [5102] = 25, [5103] = 27, [5104] = 29, [5111] = 35, [5112] = 37, [5113] = 39, [5114] = 40, [5115] = 41, [5116] = 42, [5121] = 45, [5122] = 47, [5123] = 49, [5124] = 52, [5125] = 53, [5126] = 54, [1031] = 67, [1032] = 69, [1033] = 70, [1034] = 71, [1035] = 72, [1036] = 73, [1037] = 71, [1038] = 72, [1039] = 73, [1040] = 74, [1041] = 75, [2222] = 69, [5142] = 37, [5143] = 39, [5144] = 40, [5145] = 41, [5146] = 42, [2223] = 70, [11109] = 70, [5151] = 45, [5152] = 47, [176] = 13, [5154] = 52, [5155] = 53, [5156] = 54, [1061] = 67, [1062] = 69, [1063] = 70, [1064] = 71, [1065] = 72, [1066] = 73, [1067] = 71, [1068] = 72, [1069] = 73, [1070] = 74, [1071] = 75, [2227] = 90, [1091] = 75, [1092] = 75, [1093] = 78, [1094] = 75, [1095] = 82, [1096] = 75, [2231] = 69, [1101] = 62, [1102] = 63, [1103] = 64, [1104] = 64, [1105] = 65, [1106] = 66, [1107] = 66, [2233] = 70, [1131] = 81, [1132] = 81, [1133] = 82, [1134] = 83, [1135] = 83, [1136] = 84, [1137] = 85, [1151] = 52, [1152] = 53, [1153] = 54, [1154] = 54, [1155] = 55, [1156] = 56, [1157] = 56, [2221] = 69, [1171] = 62, [1172] = 63, [1173] = 64, [1174] = 64, [2153] = 39, [1176] = 66, [1177] = 66, [1191] = 70, [1192] = 70, [11110] = 70, [2154] = 44, [11505] = 100, [11506] = 100, [11507] = 100, [11508] = 100, [11509] = 100, [11510] = 100, [2225] = 72, [1301] = 57, [1302] = 59, [1303] = 58, [1304] = 75, [1305] = 61, [1306] = 75, [1307] = 80, [1308] = 40, [1309] = 65, [1310] = 95, [7045] = 82, [7046] = 83, [2226] = 60, [7047] = 83, [7048] = 84, [1331] = 57, [1332] = 59, [1333] = 58, [1334] = 75, [1335] = 61, [5002] = 75, [5003] = 1, [7052] = 33, [11111] = 70, [7053] = 35, [7055] = 38, [1401] = 66, [1402] = 73, [1403] = 77, [7061] = 55, [7003] = 54, [7063] = 57, [5162] = 43, [7069] = 84, [5163] = 55, [931] = 49, [7076] = 54, [2232] = 69, [1501] = 69, [1502] = 72, [1503] = 76, [7078] = 55, [7079] = 56, [7080] = 57, [7081] = 82, [7075] = 40, [11100] = 50, [7077] = 54, [7009] = 53, [1601] = 68, [1602] = 70, [1603] = 75, [11101] = 50, [11102] = 50, [11113] = 90, [11103] = 50, [11104] = 50, [7049] = 85, [11105] = 50, [11106] = 70, [655] = 44, [1901] = 72, [1902] = 77, [1903] = 82, [1904] = 40, [1905] = 65, [1906] = 95, [11112] = 90, [2453] = 88, [11114] = 90, [2001] = 43, [2002] = 45, [2003] = 48, [2004] = 50, [2005] = 52, [11115] = 90, [2031] = 50, [2032] = 52, [2033] = 54, [2034] = 56, [2035] = 58, [2036] = 58, }
ITEMS
For item_list.txt :
Code:60004 ETC icon/item/60002.tgaitem_proto.txt entries for the certificate, blessing and armors :
Code:60004 loyalty_certificate ITEM_UNIQUE UNIQUE_NONE 1 ANTI_GET | ANTI_DROP | ANTI_SELL | ANTI_SAVE | ANTI_GIVE | ANTI_PKDROP | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX LOG NONE NONE 0 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 604800 0 1 0 0 0 0 0 0 70021 ±ºÁÖÀÇ ÁõÇ¥ ITEM_QUEST 0 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX NONE NONE NONE 0 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 0 0 0 0 0 0 0 0 11971 Ȳ»óÀü°© ITEM_ARMOR ARMOR_BODY 2 ANTI_ASSASSIN | ANTI_SURA | ANTI_MUDANG | ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP ITEM_TUNABLE WEAR_BODY NONE 0 0 0 0 0 LEVEL 50 LIMIT_NONE 0 APPLY_MOV_SPEED 10 APPLY_RESIST_MAGIC 20 APPLY_ATTBONUS_HUMAN 15 0 350 0 24 0 100 100 3 0 11972 ȲÀÇ ITEM_ARMOR ARMOR_BODY 2 ANTI_MUSA | ANTI_SURA | ANTI_MUDANG | ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX ITEM_TUNABLE WEAR_BODY NONE 0 0 0 0 0 LEVEL 50 LIMIT_NONE 0 APPLY_MOV_SPEED 10 APPLY_RESIST_MAGIC 20 APPLY_ATTBONUS_HUMAN 15 0 350 0 24 0 100 100 3 0 11973 ÁøÈ²»ó°© ITEM_ARMOR ARMOR_BODY 2 ANTI_MUSA | ANTI_ASSASSIN | ANTI_MUDANG | ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX ITEM_TUNABLE WEAR_BODY NONE 0 0 0 0 0 LEVEL 50 LIMIT_NONE 0 APPLY_MOV_SPEED 10 APPLY_RESIST_MAGIC 20 APPLY_ATTBONUS_HUMAN 15 0 350 0 24 0 100 100 3 0 11974 Ȳ»óÀÇ ITEM_ARMOR ARMOR_BODY 2 ANTI_MUSA | ANTI_ASSASSIN | ANTI_SURA | ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX ITEM_TUNABLE WEAR_BODY NONE 0 0 0 0 0 LEVEL 50 LIMIT_NONE 0 APPLY_MOV_SPEED 10 APPLY_RESIST_MAGIC 20 APPLY_ATTBONUS_HUMAN 15 0 350 0 24 0 100 100 3 0
Angel's Blessing
Quest written by Shogun and loosely based in the official quest used by Metin2 US. This is the item the Monarch can use to cast his powers, such as healing and attacking buffs which affect all the players from his kingdom in the same map; or summoning of different bosses and Guardians which only attack players from enemy kingdoms. It's an original YMIR item and the vnum is 70021.
Instructions are included in the quest for the rookie kings/queens.
![]()
Preparation:
1) Set MonarchHealGold event flag to an appropiate value (this is the cost of a monarch buff that heals everyone on the map)
2) Edit the list of bosses and their cost to your desires
The quest:
Code:-- World of Metin Angels Blessing quest quest angels_blessing begin state start begin when 70021.use begin if oh.ismonarch() == 0 then say_title("Angels' Blessing") say("") say("You are not qualified to use this.") say("Call me again when you become a true emperor.") say("") else local name, pid, date, money = mgmt.monarch_state(pc.get_empire()) say_title("Angels' Blessing") say("") local s = select ("Summon a Monster","Summon Royal Guards","Emperor's Blessing","Emperor's Lion Roar","Emperor's Diamond Skin","Command help","Cancel" ) if s == 1 then local data = { -- Name costs vnum {"Lykos", 200000, 191}, {"Rock Ape", 400000, 5161}, {"Bestial Captain", 500000, 591}, {"Orc Chief", 800000, 691}, {"Elite Orc Chief", 1600000, 692}, {"Hae Tae", 400000, 5002}, {"Queen Spider", 600000, 2091}, {"Nine Tails", 1200000, 1901}, {"Flame King", 1600000, 2206}, {"Yellow Tiger Ghost", 2200000, 1304}, {"Stone Tortoise", 3200000, 2192}, {"Elite Nine Tails", 4000000, 1902}, {"Dark Flame King", 4400000, 2207}, {"Close", 0, 0} } local menu = {} for i = 1, table.getn(data) do if data[i][1] == "Close" then table.insert(menu, data[i][1]) else table.insert(menu, data[i][1].." - "..tostring(data[i][2]).." Yang") end end local m = select_table(menu) if m == 14 then return end say_title("Summon a monster") say("") say("Are you sure that you want to summon ".. data[m][1] .."?") say() if select("Yes, I'm sure","No, better not") == 2 then return end local cost = data[m][2] if money < cost then return syschat("Lack of Taxes. Current Capital: "..money.." Needed Capital: "..cost) end if get_time() < pc.getqf("duration_summon") then local timeleft = math.floor((pc.getqf("duration_summon") - get_time()) / 60) local timestring = timeleft.." minutes" if timeleft < 1 then timestring = "less than a minute" end return syschat("You can't summon a monster yet. You must wait "..timestring..".") else oh.takemonarchmoney(cost/10000) mob.spawn(data[m][3],pc.get_local_x()-5, pc.get_local_y()-5,10, 10, 1) pc.setqf("duration_summon",get_time()+(60*30)) end elseif s == 2 then say_title("Summon Royal Guards") say("") local selected_npc = select ("Infantry Spearman (1.000.000 Yang)","Infantry Bowman (2.000.000 Yang)","Elite Spearman (3.000.000 Yang)","Elite Bowman (4.000.000 Yang)", "Royal Spearman (5.000.000 Yang)", "Royal Bowman (6.000.000 Yang)", "Cancel") local siege_npc = { { 9501, 9502, 9503 ,9504, 9505, 9506 }, { 9511, 9512, 9513, 9514, 9515, 9516 }, { 9521, 9522, 9523, 9524, 9525, 9526 }, } if selected_npc<7 then local cost = selected_npc * 250 local realcost = cost*10000 if money >= realcost then if get_time() < pc.getqf("duration_summon") then local timeleft = math.floor((pc.getqf("duration_summon") - get_time()) / 60) local timestring = timeleft.." minutes" if timeleft < 1 then timestring = "less than a minute" end return syschat("You can't summon troops yet. You must wait "..timestring..".") else oh.takemonarchmoney(cost) local remaining = money - realcost syschat(locale.empire_names[pc.get_empire()].."'s remaining fund is "..remaining.." Yang") mob.spawn_group(siege_npc[pc.get_empire()][selected_npc],pc.get_local_x()-5, pc.get_local_y()-5,10, 10, 1) pc.setqf("duration_summon",get_time()+(60*30)) end else syschat("Lack of Taxes. Current Capital: "..money.." Needed Capital: "..realcost) end end elseif s == 3 then say_title("Emperor's Blessing") say("") say("Emperor's Blessing can restore the HP and SP of all the") say(locale.empire_names[pc.get_empire()].."ns in questa mappa.") Dire("") say_reward("Costo: 250.000 Yang") Dire("") se soldi >= game.get_event_flag(MonarchHealGold) allora local s = seleziona ("Usa","Annulla" ) se s == 1 allora oh.monarchbless() FINE altro say("Il tuo regno non ha fondi sufficienti.") Dire("") FINE -- Ruggito del leone dell'Imperatore elseif s == 4 allora say_title("Leone dell'Imperatore") Dire("") say("Il ruggito del leone dell'Imperatore potenzierà tutti gli attacchi del popolo") say("potere in quest'area per un certo periodo.") Dire("") say_reward("Costo: 5.000.000 Yang" ) Dire("") se soldi >= 5000000 allora local s = seleziona ("Usa","Annulla" ) se s == 1 allora oh.monarchpowerup() FINE altro say("Il tuo regno non ha fondi sufficienti.") Dire("") FINE - Pugno di diamante dell'Imperatore elseif s == 5 allora say_title("Pugno di diamante dell'imperatore") Dire("") say("Il Pugno di Diamante dell'Imperatore potenzierà tutti i popoli") say("difesa in quest'area per un certo periodo.") Dire("") say_reward("Costo: 5.000.000 Yang" ) Dire("") se soldi >= 5000000 allora local s = seleziona ("Usa","Annulla" ) se s == 1 allora oh.monarchdefenseup() FINE altro say("Il tuo regno non ha fondi sufficienti.") Dire("") FINE elseif s == 6 allora say_title("Comandi:") Dire("") say("Oltre ai poteri della Benedizione dell'Angelo, hai quanto segue") say("comandi a tua disposizione:") Dire("") say("/mn - Fai un annuncio (gratuito)") say("/mto - Teletrasportarsi verso un soggetto (Costo: 10.000 Yang)") say("/mtr - Teletrasporta un soggetto a te (Costo: 10.000 Yang)") Dire("") say("Il costo viene detratto dalla Cripta del Regno.") Dire("") FINE FINE FINE FINE FINE [/CODICE] [CENTER]La funzione oh.takemonarchmoney() utilizzata nella ricerca della benedizione dell'angelo è disturbata su tutti i core db ufficiali. [B][COLOR=rgb(247, 218, 100)]Questo problema è stato risolto in Vanilla Core 2.2+. Per il db 33820 ecco un dif realizzato da Paylasici:[/COLOR][/B] [/CENTER] [CODICE][UNSTRIPPED] db_r33820_32 000A30DD: 3B 20[/CODICE] [CENTER][COLOR=rgb(247, 218, 100)][B]Per il db 40146 ecco un altro dif realizzato da PACIFICADOR [/B][/COLOR] [/CENTER] [CODICE]db_r40146 000A5015: 3B 20[/CODICE] [CENTER][B][Contenuto nascosto][/B] [I]Divertiti, [COLOR=rgb(44, 130, 201)]Masamune[/COLOR][/I][/CENTER] [/QUOTE]

