2021 yıllarında range hileleri çok yaygındı ve sunucuların oyun deneyimini olumsuz etkiliyordu. Bu nedenle, bu hilelere karşı ek bir önlem olarak böyle bir sistem geliştirdim. Kullanmak isteyen olursa, güle güle kullansın.
👉 Yani bu quest, Metin2’de çok katmanlı bir anti-hile sistemi:
Yönetim Paneli (GM için)
- GM oyuna girince bir menü açılıyor:
- Koruma Bilgisi: Aktif/pasif durumları gösteriyor (çifte, zaman, item, karakter).
- Çifte Koruma: Hem zaman hem item bazlı kontrolü aç/kapat.
- Zaman Koruma: Metin kesme sürelerini kontrol eden sistem.
- İtem Koruma: Oyuncuya gizli item vererek bot kontrolü yapıyor.
- Karakter Koruma: NPC/karakter kesme davranışlarını izliyor.
- Hakkında: Açıklama menüsü, sistemin nasıl çalıştığını anlatıyor.
Çifte Koruma (Metin kesme + item kontrolü)
- Oyuncu 8001 (metin taşı) kestiğinde:
- Oyuncunun kesme sayısı (affyok) artıyor.
- Her kesmede zaman damgası (metinadet1, metinadet2 vs.) kaydediliyor.
- Eğer zaman damgaları eşit çıkarsa → bu “bot davranışı” olarak algılanıyor → oyuncu cmdchat("quit") ile oyundan atılıyor.
- Ayrıca oyuncuya item (79726) veriliyor. Eğer bu itemden 3 tane birikirse → yine quit.
Zaman Koruma
- Yine metin kesme sayısı ve zaman damgaları tutuluyor.
- Eğer kesme süreleri şüpheli şekilde aynıysa → oyuncu oyundan atılıyor.
- Burada item verilmez, sadece zaman bazlı kontrol yapılır.
İtem Koruma
- Oyuncu metin kestiğinde gizli item (79726) veriliyor.
- Eğer oyuncunun envanterinde bu itemden 3 tane birikirse → sistem oyuncuyu oyundan atıyor.
- Bu, “REAL_TIME” özelliği olan özel item ile çalışıyor.
Karakter Koruma
- Oyuncu NPC öldürdüğünde benzer mantık çalışıyor:
- Kesme sayısı (karakter_range) artıyor.
- Zaman damgaları tutuluyor (karaktersay1, karaktersay2 vs.).
- Eğer zaman damgaları eşit çıkarsa → oyuncu oyundan atılıyor.
- 4 kesmeden sonra sayaç resetleniyor.
Özet
- Amaç: Range hack / bot kullanımını engellemek.
- Mantık:
- Oyuncunun metin/NPC kesme davranışlarını zaman damgalarıyla kontrol ediyor.
- Şüpheli eşitlikler veya item birikimi olursa → oyuncu oyundan düşürülüyor.
- GM Paneli: GM istediği korumayı açıp kapatabiliyor, sistemin durumunu görebiliyor.
👉 Yani bu quest, Metin2’de çok katmanlı bir anti-hile sistemi:
- Zaman bazlı kontrol (kesme süreleri eşit mi?)
- İtem bazlı kontrol (gizli item birikiyor mu?)
- Çifte kontrol (ikisini birden çalıştırıyor)
- Karakter kontrolü (NPC kesme davranışları)
Kod:--[[ service system : Range Fix author : ?????? version : last update --]] quest yeni_range_fix begin state start begin when letter begin send_letter("dene") end when button or info with pc.is_gm() begin local secimyap = select("Koruma Bilgisi","Çifte Koruma","Zaman Range","İtem Range","Hakkında","Karakter Koruma","Hicbiri") ---------------------Start Security İnfo(start)-------------------------- if secimyap == 1 then local koruma_bilgi1 = game.get_event_flag("codex_koruma_cifte") local koruma_bilgi2 = game.get_event_flag("codex_koruma_zaman") local koruma_bilgi3 = game.get_event_flag("codex_koruma_item") local koruma_bilgi4 = game.get_event_flag("codex_koruma_karakter") say("Range hile koruması taranıyor[DELAY value;1000]..........[/DELAY]") if koruma_bilgi1 == 1 then say("Çifte Koruma: |cff07eb96Açık!") elseif koruma_bilgi1 == 0 then say("Çifte Koruma: |cffff9999Kapalı!") end if koruma_bilgi2 == 1 then say("Zaman Koruma: |cff07eb96Açık!") elseif koruma_bilgi2 == 0 then say("Zaman Koruma: |cffff9999Kapalı!") end if koruma_bilgi3 == 1 then say("İtem Koruma: |cff07eb96Açık!") elseif koruma_bilgi3 == 0 then say("İtem Koruma: |cffff9999Kapalı!") end if koruma_bilgi4 == 1 then say("Karakter Koruma: |cff07eb96Açık!") elseif koruma_bilgi3 == 0 then say("Karakter Koruma: |cffff9999Kapalı!") end ------------------------Finish Security İnfo(finish)---------------------------- -----------------double protection (start)--------------------------- elseif secimyap == 2 then local koruma_bilgi = game.get_event_flag("codex_koruma_cifte") if koruma_bilgi == 1 then say("Çifte Koruma: |cff07eb96Açık!") say("Ne yapmak istersiniz ?") local koruma_kapa = select("Çifte Koruma Kapat","Vazgectim") if koruma_kapa == 1 then game.set_event_flag("codex_koruma_cifte",0) syschat("|cff00ff00[SİSTEM] :|cffffffffÇifte Koruma: |cffff9999Kapalı!") end elseif koruma_bilgi == 0 then say("Çifte Koruma: |cffff9999Kapalı!") say("Ne yapmak istersiniz ?") local koruma_ac = select("Çifte Koruma Ac","Vazgectim") if koruma_ac == 1 then game.set_event_flag("codex_koruma_cifte",1) syschat("|cff00ff00[SİSTEM] :|cffffffffÇifte Koruma: |cff07eb96Açık!") end end -------------------double protection (finish)-------------------------------- ------------------time protection (start)----------------------------------- elseif secimyap == 3 then local koruma_zaman_bilgi = game.get_event_flag("codex_koruma_zaman") if koruma_zaman_bilgi == 1 then say("Zaman Koruma: |cff07eb96Açık!") say("Ne yapmak istersiniz ?") local koruma_kapa_zaman = select("Zaman Koruma Kapat","Vazgectim") if koruma_kapa_zaman == 1 then game.set_event_flag("codex_koruma_zaman",0) syschat("|cff00ff00[SİSTEM] :|cffffffffZaman Koruma: |cffff9999Kapalı!") end elseif koruma_zaman_bilgi == 0 then say("Zaman Koruma: |cffff9999Kapalı!") say("Ne yapmak istersiniz ?") local koruma_ac_zaman = select("Zaman Koruma Ac","Vazgectim") if koruma_ac_zaman == 1 then game.set_event_flag("codex_koruma_zaman",1) syschat("|cff00ff00[SİSTEM] :|cffffffffZaman Koruma: |cff07eb96Açık!") end end ----------------------time protection (finish)-------------------------------- ---------------------item protection (start)---------------------------------- elseif secimyap == 4 then local koruma_item_bilgi = game.get_event_flag("codex_koruma_item") if koruma_item_bilgi == 1 then say("İtem Koruma: |cff07eb96Açık!") say("Ne yapmak istersiniz ?") local koruma_kapa_item = select("İtem Koruma Kapat","Vazgectim") if koruma_kapa_item == 1 then game.set_event_flag("codex_koruma_item",0) syschat("|cff00ff00[SİSTEM] :|cffffffffZaman Koruma: |cffff9999Kapalı!") end elseif koruma_item_bilgi == 0 then say("İtem Koruma: |cffff9999Kapalı!") say("Ne yapmak istersiniz ?") local koruma_ac_item = select("İtem Koruma Ac","Vazgectim") if koruma_ac_item == 1 then game.set_event_flag("codex_koruma_item",1) syschat("|cff00ff00[SİSTEM] :|cffffffffZaman Koruma: |cff07eb96Açık!") end end --------------------İtem protection (finish)------------------------------------- --------------------Information on protection(start)----------------------------- elseif secimyap == 5 then local hakkinda = select("Çifte Koruma Nedir?","Zaman Koruma Nedir?","İtem Koruma Nedir?","Kapat") if hakkinda == 1 then say_title("Çifte Koruma:") say("Sistem Hem zaman ile hemde item ile range kontrolü yapar.") say("Kesilen metin adetine time ataması yapılır.") say("Kesinlen metin local veri ile tanımlaması sorgulanır.") say("Verilen sürede veri sıfırlamanmazsa oyuncu oyundan düşer.") wait() say("2.Koruma Detayları:") say("Belirlediğiniz item REAL_TIME özelliği olmalıdır.") say("Belirlediğiniz itemin ismini: -yang 2546- olarak") say("değiştirmelisiniz.") say("İtemin görüntüsünü saydam olarak değiştirmelisiniz.") say("Not: Boş Petlerden 1 tanesini kullanabilirsiniz.") say("İki sistem ile oyuncu taranır kural dışında") say("İşlem yakalanırsa oyuncu oyundan düşürülür.") elseif hakkinda == 2 then say_title("Zaman Koruma:") say("Sistem Hem zaman ile hemde item ile range kontrolü yapar.") say("Kesilen metin adetine time ataması yapılır.") say("Kesinlen metin local veri ile tanımlaması sorgulanır.") say("Verilen sürede veri sıfırlamanmazsa oyuncu oyundan düşer.") elseif hakkinda == 3 then say_title("İtem Koruma:") say("Belirlediğiniz item REAL_TIME özelliği olmalıdır.") say("Belirlediğiniz itemin ismini: -yang 2546- olarak") say("değiştirmelisiniz.") say("İtemin görüntüsünü saydam olarak değiştirmelisiniz.") say("Not: Boş Petlerden 1 tanesini kullanabilirsiniz.") end---hakkinda end elseif secimyap == 6 then local karakter_koruma = game.get_event_flag("codex_koruma_karakter") if karakter_koruma == 1 then say("Karakter Koruma: |cff07eb96Açık!") say("Ne yapmak istersiniz ?") local koruma_kapa_karakter = select("Korumayı Kapat","Vazgectim") if koruma_kapa_karakter == 1 then game.set_event_flag("codex_koruma_karakter",0) syschat("|cff00ff00[SİSTEM] :|cffffffffZaman Koruma: |cffff9999Kapalı!") end ---koruma kapat karakter end elseif karakter_koruma == 0 then say("Karakter Koruma: |cffff9999Kapalı!") say("Ne yapmak istersiniz ?") local koruma_ac_karakter = select("Karakter Koruma Ac","Vazgectim") if koruma_ac_karakter == 1 then game.set_event_flag("codex_koruma_karakter",1) syschat("|cff00ff00[SİSTEM] :|cffffffffKarakter Koruma: |cff07eb96Açık!") end---karakter_ac end end---karakter_koruma end end end --------------------Information on protection(finish)----------------------------- --------------------End management panel for the game master.----------------- -----------------------------start row for range fix-------------------------- when 8001.kill with game.get_event_flag("codex_koruma_cifte") == 1 begin local delay = 1800 ---system time out local metinsayiyoruz = pc.getqf("affyok") + 1 ---local data growth pc.setqf("affyok",metinsayiyoruz) -----local data growth %^+%^^+156%^++^45 if pc.getqf("affyok") == 1 then ----- data usage control pc.setqf("metinadet1", get_time()) ----data usege control, current time measurement elseif pc.getqf("affyok") == 2 then----- data usage control pc.setqf("metinadet2", get_time())----data usege control, current time measurement elseif pc.getqf("affyok") == 3 then----- data usage control pc.setqf("metinadet3", get_time())----data usege control, current time measurement elseif pc.getqf("affyok") == 4 then----- data usage control pc.setqf("metinadet4", get_time())----data usege control, current time measurement end if pc.getqf("metinadet1")==pc.getqf("metinadet2") then ----Rule for equality of 2 sides if pc.getqf("metinadet3")==pc.getqf("metinadet4") then ----Rule for equality of 2 sides cmdchat("quit")----player penalty(player scan1) end end if pc.getqf("affyok") >= 4 then ----If the local data value is above the specified rule pc.setqf("affyok",0) ----local date value reset end pc.give_item2(79726,1)--------give the player the item and start the scan. if pc.count_item(79726) >= 3 then --------Starting a transaction for the given items according to the rule cmdchat("quit")----player penalty(player scan2) end end -----------------------------finish row for range fix(start)-------------------------- when 8001.kill with game.get_event_flag("codex_koruma_zaman") == 1 begin local delay = 1800 ---system time out local metinsayiyoruz = pc.getqf("affyok") + 1 ---local data growth pc.setqf("affyok",metinsayiyoruz) -----local data growth %^+%^^+156%^++^45 if pc.getqf("affyok") == 1 then ----- data usage control pc.setqf("metinadet1", get_time()) ----data usege control, current time measurement elseif pc.getqf("affyok") == 2 then----- data usage control pc.setqf("metinadet2", get_time())----data usege control, current time measurement elseif pc.getqf("affyok") == 3 then----- data usage control pc.setqf("metinadet3", get_time())----data usege control, current time measurement elseif pc.getqf("affyok") == 4 then----- data usage control pc.setqf("metinadet4", get_time())----data usege control, current time measurement end if pc.getqf("metinadet1")==pc.getqf("metinadet2") then ----Rule for equality of 2 sides if pc.getqf("metinadet3")==pc.getqf("metinadet4") then ----Rule for equality of 2 sides cmdchat("quit")----player penalty(player scan1) end end if pc.getqf("affyok") >= 4 then ----If the local data value is above the specified rule pc.setqf("affyok",0) ----local date value reset end end--zaman when end -----------------------------finish row for range fix(finish)-------------------------- ----------------------------start chracter range fix--------------------------- when kill with not npc.is_pc() and game.get_event_flag("codex_koruma_karakter") == 1 begin local delay = 1800 ---system time out local kesilenkarakter = pc.getqf("karakter_range") + 1 ---local data growth pc.setqf("karakter_range",kesilenkarakter) -----local data growth %^+%^^+156%^++^45 if pc.getqf("karakter_range") == 1 then ----- data usage control pc.setqf("karaktersay1", get_time()) ----data usege control, current time measurement elseif pc.getqf("karakter_range") == 2 then----- data usage control pc.setqf("karaktersay2", get_time())----data usege control, current time measurement elseif pc.getqf("karakter_range") == 3 then----- data usage control pc.setqf("karaktersay3", get_time())----data usege control, current time measurement elseif pc.getqf("karakter_range") == 4 then----- data usage control pc.setqf("karaktersay4", get_time())----data usege control, current time measurement end if pc.getqf("karaktersay1")==pc.getqf("karaktersay2") then ----Rule for equality of 2 sides if pc.getqf("karaktersay3")==pc.getqf("karaktersay4") then ----Rule for equality of 2 sides cmdchat("quit")----player penalty(player scan1) end end if pc.getqf("karakter_range") >= 4 then ----If the local data value is above the specified rule pc.setqf("karakter_range",0) ----local date value reset end end--zaman when end ----------------------finish chrac. range fix---------------------------------- --------------item protection system(start)------------------- when 8001.kill with game.get_event_flag("codex_koruma_item") == 1 begin pc.give_item2(79726,1)--------give the player the item and start the scan. if pc.count_item(79726) >= 3 then --------Starting a transaction for the given items according to the rule cmdchat("quit")----player penalty(player scan2) end end --------------item protection system(finish)------------------- end---state end end


