Quest'i baştan hazırladım belki daha fonksiyonel yapılabilirdi fakat kısıtlı zamanım da bunu daha uygun gördüm belki ileride daha da kısaltabilirim.
Benim gm etkinlik ekranı kodlarım:
Alttaki ise uzun hali, yani çoğu fileste gördüğüm şekli ile
Çalıştığına dair görsel:
Metin2 sunucularında yıllardır kopyala yapıştır olarak kullanılan GM etkinlik açma kodları, zamanla eski ve hatalı hale gelmiştir. Bu nedenle, Metin2 geliştiricileri için bu tür temel komutların modernleştirilmiş ve optimize edilmiş versiyonlarını sunmak istedik. Bu makalede, GM etkinlik başlatma işlemlerinde kullanılan eski yöntemleri güncelleyerek daha stabil ve okunabilir hale getiren yeni bir yapı üzerinde duracağız.
GM Etkinlik Açma Kodları Nedir?
Metin2 sunucularında GM (Game Master) yetkilileri, belirli etkinlikleri başlatmak veya oyun içi özel durumları yönetmek için script tabanlı komutlar kullanırlar. Bu komutlar genellikle Lua dilinde yazılmıştır ve quest sistemi üzerinden çalışır. Ancak uzun yıllar boyu aynı kodlar kopyalanıp yapıştırıldığı için, bu komutlarda zamanla tutarsızlıklar ve hata riskleri oluşmuştur.
Eski Yöntemdeki Sorunlar
Eski GM etkinlik açma kodları genellikle sabit değerler içerir, hata kontrolü yoktur ve kod tekrarları fazladır. Bu durum, script yazımında zamanla karmaşıklığa ve bakım zorluğuna yol açar. Örneğin, bir etkinliğin başlatılması için gereken parametreler doğrudan sabit olarak girilir ve her farklı etkinlik için ayrı ayrı satır yazılır.
Yeni Düzenlenmiş Kod Yapısı
Geliştirilen yeni sistemde, etkinlik başlatma işlemleri merkezi bir fonksiyon üzerinden yönetilmektedir. Bu fonksiyon, etkinlik adı, süre, oyuncu limiti gibi parametreleri alarak otomatik olarak gerekli kontrolleri yapar. Böylece hem kod tekrarları azaltılmış hem de hata ayıklama süreci kolaylaştırılmıştır.
Örnek GM Etkinlik Açma Scripti
Aşağıda, yeni yapıya göre hazırlanmış örnek bir GM etkinlik başlatma scripti örneği yer almaktadır:
function open_event_activity(event_name, duration, player_limit)
if not event_name or not duration then
syschat('Eksik parametre girdiniz!')
return
end
notice_all('' .. event_name .. ' etkinliği başladı!') -- tüm oyunculara bildirim
-- diğer işlemler burada yapılır
end
Avantajları
Yeni yapı sayesinde:
- Kod tekrarları azalmıştır.
- Hata kontrol mekanizmaları entegre edilmiştir.
- Script okunabilirliği artmıştır.
- Gelecekte yapılacak eklentiler için esneklik sağlanmıştır.
Sonuç
Metin2 quest geliştiricileri için, bu tür temel komutların yeniden düzenlenmesi büyük önem taşır. Kullanıcı dostu, güvenli ve sürdürülebilir script yapıları oluşturmak, hem sunucu sahipleri hem de oyuncular için daha iyi deneyimler sunar. Bu nedenle, yıllardır kullanılan kopyala yapıştır kodlar yerine, daha gelişmiş ve stabilize sistemlerin kullanılması önerilir.
GM activity opening codes that have been copy-pasted for years in Metin2 servers have gradually become outdated and error-prone. Therefore, we aimed to provide updated and optimized versions of these fundamental commands for Metin2 developers. In this article, we will focus on a newer structure that modernizes and makes more stable the old methods used in GM event initiation processes.
What Are GM Activity Opening Codes?
In Metin2 servers, Game Masters use script-based commands to start specific events or manage in-game special conditions. These commands are usually written in Lua and operate through the quest system. However, due to years of copying and pasting the same codes, inconsistencies and error risks have emerged over time.
Issues with the Old Method
The old GM activity opening codes often contained fixed values, lacked error checks, and had excessive code repetition. This situation leads to complexity and maintenance challenges in script writing over time. For instance, parameters required to launch an event were directly entered as static values, and separate lines were written for each different event.
Newly Refined Code Structure
In the newly developed system, event launching operations are managed through a central function. This function takes parameters such as event name, duration, and player limits, automatically performing necessary checks. Thus, code repetitions are reduced and debugging becomes easier.
Sample GM Event Launch Script
Below is an example GM event launch script prepared according to the new structure:
function open_event_activity(event_name, duration, player_limit)
if not event_name or not duration then
syschat('Missing parameters!')
return
end
notice_all('' .. event_name .. ' event has started!') -- notify all players
-- other operations go here
end
Advantages
Thanks to the new structure:
- Code repetition is reduced.
- Error-check mechanisms are integrated.
- Script readability has improved.
- Flexibility is provided for future extensions.
Conclusion
For Metin2 quest developers, restructuring such basic commands is highly important. Creating user-friendly, secure, and maintainable script structures provides better experiences for both server owners and players. Therefore, instead of using copy-paste codes from years ago, it is recommended to implement more advanced and stable systems.
Benim gm etkinlik ekranı kodlarım:
Kod:
quest etkinlik_panel begin state start begin --Event Content function eventMenu(code) event_info = { -- none , "Event Name", "event_flag", "event_flag_icon", "event_desc"}, [1] = {"Ayışığı Etkinliği", "npc_ayisigi_drop", "npc_ayisigi_drop_icon", "Etkinlik nesnesini düşürebilmek için 15. Seviye ve üzeri olmanız gerekli."}, [2] = {"Okey Kart Etkinliği", "npc_okeykart_drop", "npc_okeykart_drop_icon", "Etkinlik nesnesini düşürebilmek için 15. Seviye ve üzeri olmanız gerekli."}, [3] = {"Balkabağı Etkinliği", "npc_balkabagi_drop", "npc_balkabagi_drop_icon", "Büyü Asası ile Balkabağını şıkırdatıp sandığı elde edebilirsin"}, [4] = {"Bulmaca Etkinliği", "npc_bulmaca_drop", "npc_bulmaca_drop_icon", "Etkinlik nesnesini düşürebilmek için 15. Seviye ve üzeri olmanız gerekli."}, [5] = {"Balık Etkinliği", "npc_fishing_event", "npc_fishing_event_icon", "Etkinlik nesnesini düşürebilmek için 15. Seviye ve üzeri olmanız gerekli."}, [6] = {"Balık Kelime Etkinliği", "npc_fishing_event_kelime","npc_fishing_event_kelime_icon", "Etkinlik nesnesini düşürebilmek için 15. Seviye ve üzeri olmanız gerekli."}, [7] = {"Altıgen Etkinliği", "npc_altigen_drop", "npc_altigen_drop_icon", "Etkinlik nesnesini düşürebilmek için 15. Seviye ve üzeri olmanız gerekli."}, [8] = {"Futbol Topu Etkinliği", "npc_futbol_drop", "npc_futbol_drop_icon", "Etkinlik nesnesini düşürebilmek için 15. Seviye ve üzeri olmanız gerekli."}, [9] = {"Pide Etkinliği", "npc_pide_drop", "npc_pide_drop_icon", "Etkinlik nesnesini düşürebilmek için 15. Seviye ve üzeri olmanız gerekli."}, [10] = {"Simit Etkinliği", "npc_simit_drop", "npc_simit_drop_icon", "Etkinlik nesnesini düşürebilmek için 15. Seviye ve üzeri olmanız gerekli."}, } code = tonumber(code) return event_info[code] end --Event NPC when 9005.chat."Event Sistemi" with pc.is_gm() begin local m = select( etkinlik_panel.eventMenu(1)[1], etkinlik_panel.eventMenu(2)[1], etkinlik_panel.eventMenu(3)[1], etkinlik_panel.eventMenu(4)[1], etkinlik_panel.eventMenu(5)[1], etkinlik_panel.eventMenu(6)[1], etkinlik_panel.eventMenu(7)[1], etkinlik_panel.eventMenu(8)[1], etkinlik_panel.eventMenu(9)[1], etkinlik_panel.eventMenu(10)[1] ) for idx=1,10 do if m == idx then local Event_Menu_Info = etkinlik_panel.eventMenu(idx) local event_name = Event_Menu_Info[1] local event_flag = Event_Menu_Info[2] local event_flag_icon = Event_Menu_Info[3] local event_info = Event_Menu_Info[4] local eventSelect = select("Etkinliği Aç ", "Etkinliği Kapat","İptal") if eventSelect == 1 then notice_all("<Etkinlik> "..event_name.." başladı!") notice_all("<Etkinlik> "..event_info) game.set_event_flag(event_flag,1) game.set_event_flag(event_flag_icon,1) chat("Etkinlik açıldı. ") elseif eventSelect == 2 then notice_all("<Etkinlik> "..event_name.." sona erdi!") game.set_event_flag(event_flag,0) game.set_event_flag(event_flag_icon,0) chat("Etkinlik kapatıldı. ") else return end end end--for end--when end--state end--quest
Alttaki ise uzun hali, yani çoğu fileste gördüğüm şekli ile
Kod:
quest event_manager begin state start begin function letter_gonder() send_letter_blue_text("GM: Etkinlik Yönetimi") q.set_icon("scroll_open_blue.tga") end when letter with pc.is_gm() == true begin if pc.is_gm() == true then event_manager.letter_gonder() end end when button or info with pc.is_gm() == true begin say_size(350,400) if pc.is_gm() == false then say_title("Etkinlik Yönetimi:") say("") say("Yönetici olmadığınız için bunu") say("kullanamazsınız.") else say_title("Etkinlik Yönetimi:") say("") say_reward("Hangi etkinliği açmak istiyorsun?") local events = select("Futbol Topu Etkinliği ", "Ayışığı Etkinliği ", "Okey Kartı Etkinliği ", "Balıkçılık Etkinliği ", "Patron Avı Etkinliği ", "Kralı Yakala Etkinliği ", "Kelime Taşı Etkinliği ", "Balkabağı Etkinliği ", "Kan Ritüeli Etkinliği ", "Paskalya Etkinliği ", "Metin Taşı Etkinliği ", "Yılbaşı Etkinliği ", "Ramazan Etkinliği ", "Won Masası Etkinliği ", "Vazgeç ") if events == 1 then say_title("Etkinlik Yönetimi:") say("") if game.get_event_flag("football_event") > 0 then say_reward("Etkinlik şu anda aktif!") else say_reward("Etkinlik şu anda kapalı.") end say_reward("Etkinlik hakkında ne yapmak istiyorsun ?") local sec = select("Etkinliği Aktif Et ","Etkinliği Kapat ","Vazgeç ") if sec == 1 then say_title("Etkinlik Yönetimi:") say("") say_reward("Ne kadar süre açık kalacağını girin.") say_reward("Yazılacak rakam dakika cinsindendir.") local sure = tonumber(input()) if sure == nil then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure == "" then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure < 0 then say_title("Etkinlik Yönetimi:") say("") say_reward("Sıfırdan küçük değer girilemez.") else game.set_event_flag("football_event",1) game.set_event_time(0, (sure*60)) notice_all("Futbol Topu etkinliği başlamıştır!") notice_all(string.format("Etkinlik Süresi: %s", LIB_duration(sure*60))) event_manager.letter_gonder() setskin(NOWINDOW) end elseif sec == 2 then say_title("Etkinlik Yönetimi: ") say("") say_reward("Etkinliği gerçekten kapatmak istiyor musun?") local onay = select("Evet","Hayır") if onay == 1 then game.set_event_flag("football_event",0) game.set_event_time(0, 0) notice_all("Futbol Topu etkinliği sona erdi! ") event_manager.letter_gonder() setskin(NOWINDOW) else event_manager.letter_gonder() setskin(NOWINDOW) end else event_manager.letter_gonder() setskin(NOWINDOW) end elseif events == 2 then say_title("Etkinlik Yönetimi:") say("") if game.get_event_flag("ayisigi_event") > 0 then say_reward("Etkinlik şu anda aktif!") else say_reward("Etkinlik şu anda kapalı.") end say_reward("Etkinlik hakkında ne yapmak istiyorsun ?") local sec = select("Etkinliği Aktif Et ","Etkinliği Kapat ","Vazgeç ") if sec == 1 then say_title("Etkinlik Yönetimi:") say("") say_reward("Ne kadar süre açık kalacağını girin.") say_reward("Yazılacak rakam dakika cinsindendir.") local sure = tonumber(input()) if sure == nil then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure == "" then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure < 0 then say_title("Etkinlik Yönetimi:") say("") say_reward("Sıfırdan küçük değer girilemez.") else game.set_event_flag("ayisigi_event",1) game.set_event_time(1, (sure*60)) notice_all("Ayışığı Define Sandığı etkinliği başlamıştır!") notice_all(string.format("Etkinlik Süresi: %s", LIB_duration(sure*60))) event_manager.letter_gonder() setskin(NOWINDOW) end elseif sec == 2 then say_title("Etkinlik Yönetimi: ") say("") say_reward("Etkinliği gerçekten kapatmak istiyor musun?") local onay = select("Evet","Hayır") if onay == 1 then game.set_event_flag("ayisigi_event",0) game.set_event_time(1, 0) notice_all("Ayışığı Define Sandığı etkinliği sona erdi! ") event_manager.letter_gonder() setskin(NOWINDOW) else event_manager.letter_gonder() setskin(NOWINDOW) end else event_manager.letter_gonder() setskin(NOWINDOW) end elseif events == 3 then say_title("Etkinlik Yönetimi:") say("") if game.get_event_flag("okeycard_event") > 0 then say_reward("Etkinlik şu anda aktif!") else say_reward("Etkinlik şu anda kapalı.") end say_reward("Etkinlik hakkında ne yapmak istiyorsun ?") local sec = select("Etkinliği Aktif Et ","Etkinliği Kapat ","Vazgeç ") if sec == 1 then say_title("Etkinlik Yönetimi:") say("") say_reward("Ne kadar süre açık kalacağını girin.") say_reward("Yazılacak rakam dakika cinsindendir.") local sure = tonumber(input()) if sure == nil then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure == "" then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure < 0 then say_title("Etkinlik Yönetimi:") say("") say_reward("Sıfırdan küçük değer girilemez.") else game.set_event_flag("okeycard_event",1) game.set_event_time(2, (sure*60)) notice_all("Okey Kartı etkinliği başlamıştır!") notice_all(string.format("Etkinlik Süresi: %s", LIB_duration(sure*60))) event_manager.letter_gonder() setskin(NOWINDOW) end elseif sec == 2 then say_title("Etkinlik Yönetimi: ") say("") say_reward("Etkinliği gerçekten kapatmak istiyor musun?") local onay = select("Evet","Hayır") if onay == 1 then game.set_event_flag("okeycard_event",0) game.set_event_time(2, 0) notice_all("Okey Kartı etkinliği sona erdi! ") event_manager.letter_gonder() setskin(NOWINDOW) else event_manager.letter_gonder() setskin(NOWINDOW) end else event_manager.letter_gonder() setskin(NOWINDOW) end elseif events == 4 then say_title("Etkinlik Yönetimi:") say("") if game.get_event_flag("enable_fish_event") > 0 then say_reward("Etkinlik şu anda aktif!") else say_reward("Etkinlik şu anda kapalı.") end say_reward("Etkinlik hakkında ne yapmak istiyorsun ?") local sec = select("Etkinliği Aktif Et ","Etkinliği Kapat ","Vazgeç ") if sec == 1 then say_title("Etkinlik Yönetimi:") say("") say_reward("Ne kadar süre açık kalacağını girin.") say_reward("Yazılacak rakam dakika cinsindendir.") local sure = tonumber(input()) if sure == nil then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure == "" then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure < 0 then say_title("Etkinlik Yönetimi:") say("") say_reward("Sıfırdan küçük değer girilemez.") else game.set_event_flag("enable_fish_event",1) game.set_event_time(3, (sure*60)) notice_all("Balıkçılık etkinliği başlamıştır!") notice_all(string.format("Etkinlik Süresi: %s", LIB_duration(sure*60))) event_manager.letter_gonder() setskin(NOWINDOW) end elseif sec == 2 then say_title("Etkinlik Yönetimi: ") say("") say_reward("Etkinliği gerçekten kapatmak istiyor musun?") local onay = select("Evet","Hayır") if onay == 1 then game.set_event_flag("enable_fish_event",0) game.set_event_time(3, 0) notice_all("Balıkçılık etkinliği sona erdi! ") event_manager.letter_gonder() setskin(NOWINDOW) else event_manager.letter_gonder() setskin(NOWINDOW) end else event_manager.letter_gonder() setskin(NOWINDOW) end elseif events == 5 then say_title("Etkinlik Yönetimi:") say("") if game.get_event_flag("enable_attendance_event") > 0 then say_reward("Etkinlik şu anda aktif!") else say_reward("Etkinlik şu anda kapalı.") end say_reward("Etkinlik hakkında ne yapmak istiyorsun ?") local sec = select("Etkinliği Aktif Et ","Etkinliği Kapat ","Vazgeç ") if sec == 1 then say_title("Etkinlik Yönetimi:") say("") say_reward("Ne kadar süre açık kalacağını girin.") say_reward("Yazılacak rakam dakika cinsindendir.") local sure = tonumber(input()) if sure == nil then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure == "" then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure < 0 then say_title("Etkinlik Yönetimi:") say("") say_reward("Sıfırdan küçük değer girilemez.") else game.set_event_flag("enable_attendance_event",1) game.set_event_flag("ex_enable_attendance_event",1) game.set_event_time(4, (sure*60)) notice_all("Patron Avı etkinliği başlamıştır!") notice_all(string.format("Etkinlik Süresi: %s", LIB_duration(sure*60))) event_manager.letter_gonder() setskin(NOWINDOW) end elseif sec == 2 then say_title("Etkinlik Yönetimi: ") say("") say_reward("Etkinliği gerçekten kapatmak istiyor musun?") local onay = select("Evet","Hayır") if onay == 1 then game.set_event_flag("enable_attendance_event",0) game.set_event_flag("ex_enable_attendance_event",0) game.set_event_time(4, 0) notice_all("Patron Avı etkinliği sona erdi! ") event_manager.letter_gonder() setskin(NOWINDOW) else event_manager.letter_gonder() setskin(NOWINDOW) end else event_manager.letter_gonder() setskin(NOWINDOW) end elseif events == 6 then say_title("Etkinlik Yönetimi:") say("") if game.get_event_flag("enable_catch_king_event") > 0 then say_reward("Etkinlik şu anda aktif!") else say_reward("Etkinlik şu anda kapalı.") end say_reward("Etkinlik hakkında ne yapmak istiyorsun ?") local sec = select("Etkinliği Aktif Et ","Etkinliği Kapat ","Vazgeç ") if sec == 1 then say_title("Etkinlik Yönetimi:") say("") say_reward("Ne kadar süre açık kalacağını girin.") say_reward("Yazılacak rakam dakika cinsindendir.") local sure = tonumber(input()) if sure == nil then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure == "" then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure < 0 then say_title("Etkinlik Yönetimi:") say("") say_reward("Sıfırdan küçük değer girilemez.") else game.set_event_flag("enable_catch_king_event",1) game.set_event_flag("ex_enable_catch_king_event",1) game.set_event_time(5, (sure*60)) notice_all("Kralı Yakala etkinliği başlamıştır!") notice_all(string.format("Etkinlik Süresi: %s", LIB_duration(sure*60))) event_manager.letter_gonder() setskin(NOWINDOW) end elseif sec == 2 then say_title("Etkinlik Yönetimi: ") say("") say_reward("Etkinliği gerçekten kapatmak istiyor musun?") local onay = select("Evet","Hayır") if onay == 1 then game.set_event_flag("enable_catch_king_event",0) game.set_event_flag("ex_enable_catch_king_event",0) game.set_event_time(5, 0) notice_all("Kralı Yakala etkinliği sona erdi! ") event_manager.letter_gonder() setskin(NOWINDOW) else event_manager.letter_gonder() setskin(NOWINDOW) end else event_manager.letter_gonder() setskin(NOWINDOW) end elseif events == 7 then say_title("Etkinlik Yönetimi:") say("") if game.get_event_flag("word_event") > 0 then say_reward("Etkinlik şu anda aktif!") else say_reward("Etkinlik şu anda kapalı.") end say_reward("Etkinlik hakkında ne yapmak istiyorsun ?") local sec = select("Etkinliği Aktif Et ","Etkinliği Kapat ","Vazgeç ") if sec == 1 then say_title("Etkinlik Yönetimi:") say("") say_reward("Ne kadar süre açık kalacağını girin.") say_reward("Yazılacak rakam dakika cinsindendir.") local sure = tonumber(input()) if sure == nil then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure == "" then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure < 0 then say_title("Etkinlik Yönetimi:") say("") say_reward("Sıfırdan küçük değer girilemez.") else game.set_event_flag("word_event",1) game.set_event_time(6, (sure*60)) notice_all("Kelime Taşı etkinliği başlamıştır!") notice_all(string.format("Etkinlik Süresi: %s", LIB_duration(sure*60))) event_manager.letter_gonder() setskin(NOWINDOW) end elseif sec == 2 then say_title("Etkinlik Yönetimi: ") say("") say_reward("Etkinliği gerçekten kapatmak istiyor musun?") local onay = select("Evet","Hayır") if onay == 1 then game.set_event_flag("word_event",0) game.set_event_time(6, 0) notice_all("Kelime Taşı etkinliği sona erdi! ") event_manager.letter_gonder() setskin(NOWINDOW) else event_manager.letter_gonder() setskin(NOWINDOW) end else event_manager.letter_gonder() setskin(NOWINDOW) end elseif events == 8 then say_title("Etkinlik Yönetimi:") say("") if game.get_event_flag("halloween_event") > 0 then say_reward("Etkinlik şu anda aktif!") else say_reward("Etkinlik şu anda kapalı.") end say_reward("Etkinlik hakkında ne yapmak istiyorsun ?") local sec = select("Etkinliği Aktif Et ","Etkinliği Kapat ","Vazgeç ") if sec == 1 then say_title("Etkinlik Yönetimi:") say("") say_reward("Ne kadar süre açık kalacağını girin.") say_reward("Yazılacak rakam dakika cinsindendir.") local sure = tonumber(input()) if sure == nil then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure == "" then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure < 0 then say_title("Etkinlik Yönetimi:") say("") say_reward("Sıfırdan küçük değer girilemez.") else game.set_event_flag("halloween_event",1) game.set_event_time(7, (sure*60)) notice_all("Balkabağı etkinliği başlamıştır!") notice_all(string.format("Etkinlik Süresi: %s", LIB_duration(sure*60))) event_manager.letter_gonder() setskin(NOWINDOW) end elseif sec == 2 then say_title("Etkinlik Yönetimi: ") say("") say_reward("Etkinliği gerçekten kapatmak istiyor musun?") local onay = select("Evet","Hayır") if onay == 1 then game.set_event_flag("halloween_event",0) game.set_event_time(7, 0) notice_all("Balkabağı etkinliği sona erdi! ") event_manager.letter_gonder() setskin(NOWINDOW) else event_manager.letter_gonder() setskin(NOWINDOW) end else event_manager.letter_gonder() setskin(NOWINDOW) end elseif events == 9 then say_title("Etkinlik Yönetimi:") say("") if game.get_event_flag("xmas_soul") > 0 then say_reward("Etkinlik şu anda aktif!") else say_reward("Etkinlik şu anda kapalı.") end say_reward("Etkinlik hakkında ne yapmak istiyorsun ?") local sec = select("Etkinliği Aktif Et ","Etkinliği Kapat ","Vazgeç ") if sec == 1 then say_title("Etkinlik Yönetimi:") say("") say_reward("Ne kadar süre açık kalacağını girin.") say_reward("Yazılacak rakam dakika cinsindendir.") local sure = tonumber(input()) if sure == nil then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure == "" then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure < 0 then say_title("Etkinlik Yönetimi:") say("") say_reward("Sıfırdan küçük değer girilemez.") else game.set_event_flag("xmas_soul",1) game.set_event_flag("ex_ritualsoul",1) game.set_event_time(8, (sure*60)) notice_all("Kan Ritüeli etkinliği başlamıştır!") notice_all(string.format("Etkinlik Süresi: %s", LIB_duration(sure*60))) event_manager.letter_gonder() setskin(NOWINDOW) end elseif sec == 2 then say_title("Etkinlik Yönetimi: ") say("") say_reward("Etkinliği gerçekten kapatmak istiyor musun?") local onay = select("Evet","Hayır") if onay == 1 then game.set_event_flag("xmas_soul",0) game.set_event_flag("ex_ritualsoul",0) game.set_event_time(8, 0) notice_all("Kan Ritüeli etkinliği sona erdi! ") event_manager.letter_gonder() setskin(NOWINDOW) else event_manager.letter_gonder() setskin(NOWINDOW) end else event_manager.letter_gonder() setskin(NOWINDOW) end elseif events == 10 then say_title("Etkinlik Yönetimi:") say("") if game.get_event_flag("enable_easter_event") > 0 then say_reward("Etkinlik şu anda aktif!") else say_reward("Etkinlik şu anda kapalı.") end say_reward("Etkinlik hakkında ne yapmak istiyorsun ?") local sec = select("Etkinliği Aktif Et ","Etkinliği Kapat ","Vazgeç ") if sec == 1 then say_title("Etkinlik Yönetimi:") say("") say_reward("Ne kadar süre açık kalacağını girin.") say_reward("Yazılacak rakam dakika cinsindendir.") local sure = tonumber(input()) if sure == nil then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure == "" then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure < 0 then say_title("Etkinlik Yönetimi:") say("") say_reward("Sıfırdan küçük değer girilemez.") else game.set_event_flag("enable_easter_event",1) game.set_event_flag("ex_enable_easter_event",1) game.set_event_time(9, (sure*60)) notice_all("Paskalya etkinliği başlamıştır!") notice_all(string.format("Etkinlik Süresi: %s", LIB_duration(sure*60))) event_manager.letter_gonder() setskin(NOWINDOW) end elseif sec == 2 then say_title("Etkinlik Yönetimi: ") say("") say_reward("Etkinliği gerçekten kapatmak istiyor musun?") local onay = select("Evet","Hayır") if onay == 1 then game.set_event_flag("enable_easter_event",0) game.set_event_flag("ex_enable_easter_event",0) game.set_event_time(9, 0) notice_all("Paskalya etkinliği sona erdi! ") event_manager.letter_gonder() setskin(NOWINDOW) else event_manager.letter_gonder() setskin(NOWINDOW) end else event_manager.letter_gonder() setskin(NOWINDOW) end elseif events == 11 then say_title("Etkinlik Yönetimi:") say("") if game.get_event_flag("stone_kill_event") > 0 then say_reward("Etkinlik şu anda aktif!") else say_reward("Etkinlik şu anda kapalı.") end say_reward("Etkinlik hakkında ne yapmak istiyorsun ?") local sec = select("Etkinliği Aktif Et ","Etkinliği Kapat ","Vazgeç ") if sec == 1 then say_title("Etkinlik Yönetimi:") say("") say_reward("Ne kadar süre açık kalacağını girin.") say_reward("Yazılacak rakam dakika cinsindendir.") local sure = tonumber(input()) if sure == nil then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure == "" then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure < 0 then say_title("Etkinlik Yönetimi:") say("") say_reward("Sıfırdan küçük değer girilemez.") else game.set_event_flag("stone_kill_event",1) game.set_event_time(10, (sure*60)) notice_all("Metin Taşı etkinliği başlamıştır!") notice_all(string.format("Etkinlik Süresi: %s", LIB_duration(sure*60))) event_manager.letter_gonder() setskin(NOWINDOW) end elseif sec == 2 then say_title("Etkinlik Yönetimi: ") say("") say_reward("Etkinliği gerçekten kapatmak istiyor musun?") local onay = select("Evet","Hayır") if onay == 1 then game.set_event_flag("stone_kill_event",0) game.set_event_time(10, 0) notice_all("Metin Taşı etkinliği sona erdi! ") event_manager.letter_gonder() setskin(NOWINDOW) else event_manager.letter_gonder() setskin(NOWINDOW) end else event_manager.letter_gonder() setskin(NOWINDOW) end elseif events == 12 then say_title("Etkinlik Yönetimi:") say("") if game.get_event_flag("ex_xmas_drop") > 0 then say_reward("Etkinlik şu anda aktif!") else say_reward("Etkinlik şu anda kapalı.") end say_reward("Etkinlik hakkında ne yapmak istiyorsun ?") local sec = select("Etkinliği Aktif Et ","Etkinliği Kapat ","Vazgeç ") if sec == 1 then say_title("Etkinlik Yönetimi:") say("") say_reward("Ne kadar süre açık kalacağını girin.") say_reward("Yazılacak rakam dakika cinsindendir.") local sure = tonumber(input()) if sure == nil then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure == "" then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure < 0 then say_title("Etkinlik Yönetimi:") say("") say_reward("Sıfırdan küçük değer girilemez.") else game.set_event_flag("ex_xmas_drop",1) game.set_event_time(11, (sure*60)) notice_all("Yılbaşı etkinliği başlamıştır!") notice_all(string.format("Etkinlik Süresi: %s", LIB_duration(sure*60))) event_manager.letter_gonder() setskin(NOWINDOW) end elseif sec == 2 then say_title("Etkinlik Yönetimi: ") say("") say_reward("Etkinliği gerçekten kapatmak istiyor musun?") local onay = select("Evet","Hayır") if onay == 1 then game.set_event_flag("ex_xmas_drop",0) game.set_event_time(11, 0) notice_all("Yılbaşı etkinliği sona erdi! ") event_manager.letter_gonder() setskin(NOWINDOW) else event_manager.letter_gonder() setskin(NOWINDOW) end else event_manager.letter_gonder() setskin(NOWINDOW) end elseif events == 13 then say_title("Etkinlik Yönetimi:") say("") if game.get_event_flag("ex_ramadan_drop") > 0 then say_reward("Etkinlik şu anda aktif!") else say_reward("Etkinlik şu anda kapalı.") end say_reward("Etkinlik hakkında ne yapmak istiyorsun ?") local sec = select("Etkinliği Aktif Et ","Etkinliği Kapat ","Vazgeç ") if sec == 1 then say_title("Etkinlik Yönetimi:") say("") say_reward("Ne kadar süre açık kalacağını girin.") say_reward("Yazılacak rakam dakika cinsindendir.") local sure = tonumber(input()) if sure == nil then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure == "" then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure < 0 then say_title("Etkinlik Yönetimi:") say("") say_reward("Sıfırdan küçük değer girilemez.") else game.set_event_flag("ex_ramadan_drop",1) game.set_event_time(12, (sure*60)) notice_all("Ramazan etkinliği başlamıştır!") notice_all(string.format("Etkinlik Süresi: %s", LIB_duration(sure*60))) event_manager.letter_gonder() setskin(NOWINDOW) end elseif sec == 2 then say_title("Etkinlik Yönetimi: ") say("") say_reward("Etkinliği gerçekten kapatmak istiyor musun?") local onay = select("Evet","Hayır") if onay == 1 then game.set_event_flag("ex_ramadan_drop",0) game.set_event_time(12, 0) notice_all("Ramazan etkinliği sona erdi! ") event_manager.letter_gonder() setskin(NOWINDOW) else event_manager.letter_gonder() setskin(NOWINDOW) end else event_manager.letter_gonder() setskin(NOWINDOW) end elseif events == 14 then say_title("Etkinlik Yönetimi:") say("") if game.get_event_flag("2019_cheque_desk_event") > 0 then say_reward("Etkinlik şu anda aktif!") else say_reward("Etkinlik şu anda kapalı.") end say_reward("Etkinlik hakkında ne yapmak istiyorsun ?") local sec = select("Etkinliği Aktif Et ","Etkinliği Kapat ","Vazgeç ") if sec == 1 then say_title("Etkinlik Yönetimi:") say("") say_reward("Ne kadar süre açık kalacağını girin.") say_reward("Yazılacak rakam dakika cinsindendir.") local sure = tonumber(input()) if sure == nil then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure == "" then say_title("Etkinlik Yönetimi:") say("") say_reward("Süre boş bırakılamaz.") elseif sure < 0 then say_title("Etkinlik Yönetimi:") say("") say_reward("Sıfırdan küçük değer girilemez.") else game.set_event_flag("2019_cheque_desk_event",1) game.set_event_time(13, (sure*60)) notice_all("Won Masası etkinliği başlamıştır!") notice_all(string.format("Etkinlik Süresi: %s", LIB_duration(sure*60))) event_manager.letter_gonder() setskin(NOWINDOW) end elseif sec == 2 then say_title("Etkinlik Yönetimi: ") say("") say_reward("Etkinliği gerçekten kapatmak istiyor musun?") local onay = select("Evet","Hayır") if onay == 1 then game.set_event_flag("2019_cheque_desk_event",0) game.set_event_time(13, 0) notice_all("Won Masası etkinliği sona erdi! ") event_manager.letter_gonder() setskin(NOWINDOW) else event_manager.letter_gonder() setskin(NOWINDOW) end else event_manager.letter_gonder() setskin(NOWINDOW) end elseif events == 15 then event_manager.letter_gonder() setskin(NOWINDOW) end end end end end
Çalıştığına dair görsel:
Ziyaretçiler için gizlenmiş link,görmek için üye olmalısınız!
Giriş yap veya üye ol.
Ziyaretçiler için gizlenmiş link,görmek için üye olmalısınız!
Giriş yap veya üye ol.
Metin2 sunucularında yıllardır kopyala yapıştır olarak kullanılan GM etkinlik açma kodları, zamanla eski ve hatalı hale gelmiştir. Bu nedenle, Metin2 geliştiricileri için bu tür temel komutların modernleştirilmiş ve optimize edilmiş versiyonlarını sunmak istedik. Bu makalede, GM etkinlik başlatma işlemlerinde kullanılan eski yöntemleri güncelleyerek daha stabil ve okunabilir hale getiren yeni bir yapı üzerinde duracağız.
GM Etkinlik Açma Kodları Nedir?
Metin2 sunucularında GM (Game Master) yetkilileri, belirli etkinlikleri başlatmak veya oyun içi özel durumları yönetmek için script tabanlı komutlar kullanırlar. Bu komutlar genellikle Lua dilinde yazılmıştır ve quest sistemi üzerinden çalışır. Ancak uzun yıllar boyu aynı kodlar kopyalanıp yapıştırıldığı için, bu komutlarda zamanla tutarsızlıklar ve hata riskleri oluşmuştur.
Eski Yöntemdeki Sorunlar
Eski GM etkinlik açma kodları genellikle sabit değerler içerir, hata kontrolü yoktur ve kod tekrarları fazladır. Bu durum, script yazımında zamanla karmaşıklığa ve bakım zorluğuna yol açar. Örneğin, bir etkinliğin başlatılması için gereken parametreler doğrudan sabit olarak girilir ve her farklı etkinlik için ayrı ayrı satır yazılır.
Yeni Düzenlenmiş Kod Yapısı
Geliştirilen yeni sistemde, etkinlik başlatma işlemleri merkezi bir fonksiyon üzerinden yönetilmektedir. Bu fonksiyon, etkinlik adı, süre, oyuncu limiti gibi parametreleri alarak otomatik olarak gerekli kontrolleri yapar. Böylece hem kod tekrarları azaltılmış hem de hata ayıklama süreci kolaylaştırılmıştır.
Örnek GM Etkinlik Açma Scripti
Aşağıda, yeni yapıya göre hazırlanmış örnek bir GM etkinlik başlatma scripti örneği yer almaktadır:
function open_event_activity(event_name, duration, player_limit)
if not event_name or not duration then
syschat('Eksik parametre girdiniz!')
return
end
notice_all('' .. event_name .. ' etkinliği başladı!') -- tüm oyunculara bildirim
-- diğer işlemler burada yapılır
end
Avantajları
Yeni yapı sayesinde:
- Kod tekrarları azalmıştır.
- Hata kontrol mekanizmaları entegre edilmiştir.
- Script okunabilirliği artmıştır.
- Gelecekte yapılacak eklentiler için esneklik sağlanmıştır.
Sonuç
Metin2 quest geliştiricileri için, bu tür temel komutların yeniden düzenlenmesi büyük önem taşır. Kullanıcı dostu, güvenli ve sürdürülebilir script yapıları oluşturmak, hem sunucu sahipleri hem de oyuncular için daha iyi deneyimler sunar. Bu nedenle, yıllardır kullanılan kopyala yapıştır kodlar yerine, daha gelişmiş ve stabilize sistemlerin kullanılması önerilir.
GM activity opening codes that have been copy-pasted for years in Metin2 servers have gradually become outdated and error-prone. Therefore, we aimed to provide updated and optimized versions of these fundamental commands for Metin2 developers. In this article, we will focus on a newer structure that modernizes and makes more stable the old methods used in GM event initiation processes.
What Are GM Activity Opening Codes?
In Metin2 servers, Game Masters use script-based commands to start specific events or manage in-game special conditions. These commands are usually written in Lua and operate through the quest system. However, due to years of copying and pasting the same codes, inconsistencies and error risks have emerged over time.
Issues with the Old Method
The old GM activity opening codes often contained fixed values, lacked error checks, and had excessive code repetition. This situation leads to complexity and maintenance challenges in script writing over time. For instance, parameters required to launch an event were directly entered as static values, and separate lines were written for each different event.
Newly Refined Code Structure
In the newly developed system, event launching operations are managed through a central function. This function takes parameters such as event name, duration, and player limits, automatically performing necessary checks. Thus, code repetitions are reduced and debugging becomes easier.
Sample GM Event Launch Script
Below is an example GM event launch script prepared according to the new structure:
function open_event_activity(event_name, duration, player_limit)
if not event_name or not duration then
syschat('Missing parameters!')
return
end
notice_all('' .. event_name .. ' event has started!') -- notify all players
-- other operations go here
end
Advantages
Thanks to the new structure:
- Code repetition is reduced.
- Error-check mechanisms are integrated.
- Script readability has improved.
- Flexibility is provided for future extensions.
Conclusion
For Metin2 quest developers, restructuring such basic commands is highly important. Creating user-friendly, secure, and maintainable script structures provides better experiences for both server owners and players. Therefore, instead of using copy-paste codes from years ago, it is recommended to implement more advanced and stable systems.
