elite*gold: 30
Join Date: Mar 2012
Posts: 517
Received Thanks: 339
|
[Lua-C++]Full Event System
Hallo All
i've been basy for while of time ( away from metin2 ) and i'm now start thinking in leave it for ever
so i will share with u my event system
what is include ?
Event.quest ( for start / close events )
event_drop.quest ( for drops items from monster/boss/stone) for all event
[ event.quest ]
PHP Code:
quest event begin state start begin when login or enter with pc.get_gm_level()==5 begin set_state(event) end end state event begin when letter begin send_letter(gameforge.event.letter_10) end when button or info begin say_title(gameforge.event.title_20) local event_type = select(gameforge.event.say_110, gameforge.event.say_70) if event_type == 2 then say(gameforge.event.say_80) local rate = input_number() game.set_event_flag("event_rate", rate) else say(gameforge.event.say_30) local events_info = { -- name = Name of the event ( it will show for game master / players when start or close ) -- flag = event flag {["Name"] = " only monster drop ", ["Flag"] = "test_mobs_event"}, {["Name"] = " only stone drop ", ["Flag"] = "test_stone_event"}, {["Name"] = " kill kill kill ", ["Flag"] = "test_mobs_stone_event"}, } local menu01 = {} for num1,str1 in ipairs(events_info) do table.insert(menu01, str1["Name"]) end table.insert(menu01, gameforge.locale.cancel) local seltab01 = select_table(menu01) if seltab01 == table.getn(menu01) then return end say_reward(gameforge.event.say_reward_40) local s = select(gameforge.event.select_50, gameforge.event.select_60, gameforge.locale.cancel) if s == 1 then notice_all(string.format(gameforge.event.notice_70, events_info[seltab01]["Name"])) game.set_event_flag(events_info[seltab01]["Flag"], 1) elseif s == 2 then notice_all(string.format(gameforge.event.notice_80, events_info[seltab01]["Name"])) game.set_event_flag(events_info[seltab01]["Flag"], 0) end end set_state(start) end end end
[ event.quest - Untested ]
PHP Code:
quest event begin state start begin when login or enter with pc.get_gm_level()==5 begin set_state(event) end end state event begin when letter begin send_letter(gameforge.event.letter_10) end when button or info begin say_title(gameforge.event.title_20) local event_type = select(gameforge.event.say_110, gameforge.event.say_70) if event_type == 2 then say(gameforge.event.say_80) local rate = input_number() game.set_event_flag("event_rate", rate) else say(gameforge.event.say_30) local menu01 = {} for num1,str1 in ipairs(get_events_table()) do table.insert(menu01, str1["Name"]) end table.insert(menu01, gameforge.locale.cancel) local seltab01 = select_table(menu01) if seltab01 == table.getn(menu01) then return end say_reward(gameforge.event.say_reward_40) local s = select(gameforge.event.select_50, gameforge.event.select_60, gameforge.locale.cancel) if s == 1 then notice_all(string.format(gameforge.event.notice_70, get_events_table()[seltab01]["Name"])) game.set_event_flag(get_events_table()[seltab01]["Flag"], 1) elseif s == 2 then notice_all(string.format(gameforge.event.notice_80, get_events_table()[seltab01]["Name"])) game.set_event_flag(get_events_table()[seltab01]["Flag"], 0) end end set_state(start) end end end
[ events_drop.quest ]
PHP Code:
quest event_drop begin state start begin when login or enter begin for i,v in ipairs(get_events_table()) do if game.get_event_flag(v["Flag"]) == 1 then syschat(string.format(gameforge.event.say_100, v["Name"])) end end end when kill with not npc.is_pc() begin for i,v in ipairs(get_events_table()) do if game.get_event_flag(v["Flag"]) == 1 then local give_table = {} local level = pc.get_level() local limit = npc.get_level0() local rate = game.get_event_flag("event_rate") if rate == nil then rate = 10 end -- false = gotse to inv -- true = drop on the ground local drop = false if v["type"] == npc.get_type0() or v["type"] == 3 then if level < limit+5 then if math.random(1, 100) <= rate then for i=1,table.getn(v) do if v[i] ~= nil then table.insert(give_table, v[i]) end end local give_item = give_table[number(1,table.getn(give_table))] if drop then game.drop_item_with_ownership(give_item) else if pc.enough_inventory(give_item) then pc.give_item2(give_item) else game.drop_item_with_ownership(give_item) end end end end end end end end end end
[quest_lib.lua]
PHP Code:
-- ################### -- ### By MrLibya ### -- ###################
function get_events_table() if events_info == nil then events_info={ -- name = Name of the event ( it will show for game master / players when start or close ) -- flag = event flag -- type -- 1 = monster -- 2 = stone -- 3 = both ( monster & stone) -- in the end just keep putting the items will drop with no limit {["Name"] = " only monster drop ", ["Flag"] = "test_mobs_event", ["type"] = 1, 41029,41030}, {["Name"] = " only stone drop ", ["Flag"] = "test_stone_event", ["type"] = 2, 41145,41146,41147,41148,41149,41150}, {["Name"] = " kill kill kill ", ["Flag"] = "test_mobs_stone_event", ["type"] = 3, 45135,45136,45137,45138}, } end return events_info end
source part :
add in questlua_npc
PHP Code:
int npc_get_type0(lua_State * L) { CQuestManager& q = CQuestManager::instance(); LPCHARACTER npc = q.GetCurrentNPCCharacterPtr(); if (npc) { if(npc->IsMonster()) lua_pushnumber(L, 1); else if ( npc->IsStone()) lua_pushnumber(L, 2); } else lua_pushnumber(L, 0); return 1; }
For who not know, the system makes easy to add new event , with no limit of items , that mean u don't need to edit anything in the quest code to add new items for the event , just add in the event field the items id and the quest will auto read how much items u put there
|