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:
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:
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 :
For item_list.txt :
Code:
60004 ETC icon/item/60002.tga
item_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:
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 this map.")
say("")
say_reward("Cost : 250.000 Yang")
say("")
if money >= game.get_event_flag(MonarchHealGold) then
local s = select ("Use","Cancel" )
if s == 1 then
oh.monarchbless()
end
else
say("Your kingdom doesn't have enough funds.")
say("")
end
-- Emperor's Lion Roar
elseif s == 4 then
say_title("Emperor's Lion Loar")
say("")
say("Emperor's Lion Roar will boost all the people's attack")
say("power in this area for a certain period.")
say("")
say_reward("Cost : 5.000.000 Yang" )
say("")
if money >= 5000000 then
local s = select ("Use","Cancel" )
if s == 1 then
oh.monarchpowerup()
end
else
say("Your kingdom doesn't have enough funds.")
say("")
end
-- Emperor's Diamond fist
elseif s == 5 then
say_title("Emperor's Diamond Fist")
say("")
say("Emperor's Diamond Fist will boost all the people's")
say("defence in this area for a certain period.")
say("")
say_reward("Cost : 5.000.000 Yang" )
say("")
if money >= 5000000 then
local s = select ("Use","Cancel" )
if s == 1 then
oh.monarchdefenseup()
end
else
say("Your kingdom doesn't have enough funds.")
say("")
end
elseif s == 6 then
say_title("Commands:")
say("")
say("Beyond the Angel's Blessing powers, you have the following")
say("commands at your disposal:")
say("")
say("/mn - Make an announcement (Free)")
say("/mto - Teleport to a subject (Cost: 10.000 Yang)")
say("/mtr - Teleport a subject to you (Cost: 10.000 Yang)")
say("")
say("The cost is deducted from the Kingdom Vault.")
say("")
end
end
end
end
end
The function oh.takemonarchmoney() used in the angel's blessing quest is bugged on all official db cores.
This is fixed in Vanilla Core 2.2+. For db 33820 here is a dif made by Paylasici:
This is fixed in Vanilla Core 2.2+. For db 33820 here is a dif made by Paylasici:
Code:
[UNSTRIPPED] db_r33820_32
000A30DD: 3B 20
For db 40146 here's another dif made by PACIFICADOR
Code:
db_r40146
000A5015: 3B 20
Hidden content
You need to reply to this thread in order to see this content.
Have fun,
Masamune