Bir Metin2 oto av sistemi, oyuncunun karakterini belirli bir bölgede otomatik olarak avlandıran, can/mana yönetimini üstlenen ve düşen eşyaları toplayan bir kolaylık özelliğidir. Birçok özel sunucu, oyuncuları meşgul tutmak ve "farm" döngüsünü daha az yorucu hâle getirmek için bu sistemi sunar. Ama bu özellik iki ucu keskin bir bıçaktır: yanlış kurgulandığında ekonomiyi ve oyuncu emeğinin değerini bir gecede çökertebilir. Bu yazıda hem mimariyi hem de denge kaygılarını ele alıyorum.
Oto av sistemi tam olarak ne yapar?
Temelde bir oto av modülü şu görevleri döngüsel olarak yürütür:
- Hedef seçimi: Karakterin etrafındaki belirli yarıçap içindeki canavarları tarar ve en yakın/en uygun hedefi seçer.
- Saldırı: Hedefe normal vuruş veya seçili yetenekleri uygular.
- Hayatta kalma: Can belirli bir eşiğin altına düşünce iksir kullanır ya da güvenli bir noktaya döner.
- Toplama: Yere düşen yang, eşya ve metin taşı parçalarını otomatik alır.
- Sınırlandırma: Yalnızca tanımlı bir bölge/harita içinde çalışır; süre veya öldürme limiti dolunca durur.
Buradaki en kritik kural mimari değil felsefedir: sistem sunucu tarafında çalışmalı. İstemciye güvenen her oto av sistemi, hile programlarına davetiye çıkarır.
İstemci tarafı değil, sunucu tarafı
Metin2'nin orijinal hile sorunlarının büyük kısmı, istemciye fazla yetki verilmesinden doğar. Oto av özelliğini istemcide (Python arayüzü veya enjekte edilen kod) çalıştırırsanız, oyuncu o mantığı ele geçirip kendi lehine değiştirebilir: sonsuz menzil, anlık öldürme, ışınlanarak toplama. Doğru yaklaşım, kararların game sunucu çekirdeğinde alınmasıdır. İstemci yalnızca "oto av başlat" isteğini gönderir; geri kalan her şeyi sunucu doğrular ve yürütür.
Pratikte bu, mantığı büyük ölçüde quest sistemi (lua) ve/veya çekirdek C++ üzerinden kurmak demektir. Quest tabanlı yaklaşım, kaynak kodunu derlemeden esnek mantık yazmaya izin verdiği için topluluk sunucularında en yaygın olanıdır.
Quest tetikleyicilerle iskelet
Quest sistemi, zamanlayıcılar (timer) ve olay kancaları (örneğin when kill, when login) sunar. Bir döngüyü periyodik bir timer ile sürdürebilirsiniz. Aşağıda kavramsal bir iskelet var; gerçek bir sunucuda hedef seçimi ve saldırı için çekirdek tarafında açılmış fonksiyonlara ihtiyacınız olur:
quest auto_hunt begin
state start begin
-- Oyuncu komutu ile başlatılır
when "/oto" command begin
if pc.get_map_index() != ALLOWED_MAP then
syschat("Bu bölgede oto av kapali.")
return
end
pc.setqf("hunting", 1)
-- 2 saniyede bir tetiklenen döngü
server_timer("hunt_tick", 2, pc.get_player_id())
syschat("Oto av baslatildi.")
end
when hunt_tick.server_timer begin
local pid = get_server_timer_arg()
if pc.select(pid) == false then return end
if pc.get_map_index() != ALLOWED_MAP then
pc.setqf("hunting", 0)
return
end
-- Can dustuyse iksir/return mantigi burada
if pc.get_hp() < pc.get_max_hp() * 0.3 then
-- guvenli noktaya don / iksir kullan
end
-- Devam ettir
if pc.getqf("hunting") == 1 then
server_timer("hunt_tick", 2, pid)
end
end
end
end
Bu örnekteki ALLOWED_MAP, sistemin yalnızca izin verilen haritalarda dönmesini sağlar. Asıl "hedef bul ve vur" adımı için ya çekirdeğe yeni bir Lua fonksiyonu eklemeniz (C++ tarafında CFuncTable üzerinden register) ya da yapay zekâya benzer bir takip/saldırı davranışını tetiklemeniz gerekir. Burada uydurma fonksiyon adı kullanmamak önemli; kendi sunucu kaynağınızdaki gerçek API'yi temel alın.
Güvenlik ve doğrulama
Sistem sunucuda çalışsa bile, istemciden gelen her isteği şüpheyle karşılayın:
- Hız sınırı: "oto av başlat" paketinin saniyede onlarca kez gönderilmediğini kontrol edin; aksi hâlde döngü zamanlayıcılarını çoğaltarak sunucuyu boğabilirler.
- Menzil doğrulaması: Saldırı ve toplama mesafesini her zaman sunucuda hesaplayın. İstemcinin "şu canavardayım" iddiasına güvenmeyin.
- Durum tutarlılığı: Oyuncunun gerçekten izinli haritada, hayatta ve oturum açmış olduğunu her tick'te doğrulayın.
- Loglama: Kazanılan yang ve item'ları ayrı bir tabloya yazın ki sonradan denetleyebilesiniz.
En kritik kısım: oyun dengesi
Teknik olarak çalışan bir sistem, oyununuzu yine de mahvedebilir. Oto av, oyuncu emeğini otomatikleştirdiği için ekonomik girdiyi (yang, eşya, taş) çarpan etkisiyle artırır. Dengeyi korumak için somut frenler koyun:
- Günlük süre/öldürme limiti: Örneğin günde 2 saat veya 5.000 öldürme. Limit dolunca sistem kapanır.
- Düşük drop oranı: Oto av sırasındaki drop'u manuel avın altında tutun (örn. %50). Manuel oynamak her zaman daha kârlı kalmalı.
- Bölge kısıtı: Yalnızca alt seviye/orta seviye haritalarda izin verin; uç içerik (boss, yüksek seviye metin) manuel kalsın.
- Çevrimiçi zorunluluğu / AFK denetimi: Düzenli aralıklarla basit bir doğrulama ya da en azından bağlantı kopunca otomatik durma ekleyin.
- Premium kapısı dikkatli kullanın: Oto av'ı paralı yaparsanız "pay-to-farm" algısı oluşur; bu, ücretsiz oyuncuları küstürebilir.
Altın kural: oto av bir kolaylık olmalı, bir kazanç motoru değil. Manuel oynayan oyuncu her zaman daha hızlı ilerlemeli.
Test ve devreye alma
Yeni sistemi asla doğrudan canlıya koymayın. Önce yerel bir test sunucusunda, sahte ekonomi verisiyle 24-48 saat çalıştırın; üretilen yang ve eşya miktarını ölçün. Ardından sınırlı bir kapalı beta ile gerçek oyuncu davranışını gözlemleyin. Drop ve süre limitlerini config dosyasından ayarlanabilir bırakın ki sunucuyu yeniden derlemeden ince ayar yapabilesiniz.
Sık Sorulan Sorular
Oto av sistemini istemcide yapsam olmaz mı?
Olur ama tavsiye edilmez. İstemci tarafı mantık, hile programlarıyla kolayca manipüle edilir. Karar ve doğrulamayı sunucuda tutmak, hem güvenlik hem de denetlenebilirlik için şarttır.
Quest mi yoksa C++ kaynak mı kullanmalıyım?
İkisi birlikte en sağlamıdır. Akış kontrolü ve limitler için quest/Lua esnektir; hedef tarama ve saldırı gibi performans kritik işlemler için çekirdek C++ tarafı daha verimlidir.
Oto av ekonomiyi bozar mı?
Frensiz bırakılırsa kesinlikle bozar. Günlük limit, düşük drop oranı ve bölge kısıtı gibi önlemlerle bu riski yönetebilir ve sistemi sağlıklı tutabilirsiniz.
Sunucunuza dengeli bir oto av sistemi mi kurmak istiyorsunuz? Quest mimarisinden ekonomi ayarlarına kadar uçtan uca yardımcı olabilirim. Benimle iletişime geçin ve projenizi konuşalım.