Neler yeni

Seni de aramızda görmek istiyoruz! 🚀

Bilgi paylaştıkça çoğalır. Şu an misafir olarak buradasın ama sadece birkaç saniyeni ayırarak ücretsiz üye olabilir; binlerce içeriğe erişebilir, sorularını sorabilir ve topluluğumuzun bir parçası olabilirsin. Geliştirmek, öğrenmek ve paylaşmak için hemen aramıza katıl!

Kendi Oyununuz İçin Mod Desteği Ekleme — Geliştiriciler İçin API Tasarımı

baki

Sahip
Yönetici

🔧 MOD DESTEĞİ EKLEME — KENDİ OYUNUNUZU MODLANABİLİR YAPIN 🔧
Topluluk içeriği, oyununuzun ömrünü nasıl uzatır?
​




Merhaba! 🔧

Şimdiye kadar başkalarının oyunlarını modlamayı konuştuk — bu sefer madalyonun diğer yüzü: kendi oyununuza mod desteği nasıl eklersiniz? Bu konuda pratik bir API tasarımı ve mimari yaklaşımı ele aldım.

🤔 Neden Mod Desteği Eklemeli?[/B>

• Oyununuzun ömrünü ciddi şekilde uzatabiliyor — Skyrim, Minecraft gibi oyunlar mod sayesinde yıllarca güncel kalıyor
• Topluluk katılımı ve bağlılığı artırıyor
• Bazı en iyi içerik fikirleri topluluktan gelebiliyor
• Ek maliyetsiz içerik genişlemesi sağlıyor

🏗️ Temel Mimari Yaklaşımı — Plugin Sistemi[/B>

Python:
# Basit ama genişletilebilir bir mod/plugin sistemi mimarisi
# (Kavramsal örnek — Python ile, ama prensip her dile uygulanabilir)
 
import importlib.util
import os
from abc import ABC, abstractmethod
 
# ─── MOD ARAYÜZÜ — Her mod bu şablonu takip etmeli ──
class OyunModu(ABC):
    """
    Tüm modların uygulaması gereken temel arayüz.
    Bu, oyununuzun modlarla nasıl 'konuşacağını' tanımlıyor.
    """
 
    @abstractmethod
    def mod_bilgisi(self) -> dict:
        """Mod adı, versiyon, yazar bilgisi döndürür"""
        pass
 
    @abstractmethod
    def yuklendiginde(self, oyun_api):
        """Mod yüklendiğinde bir kez çağrılır — kayıt işlemleri burada"""
        pass
 
    def her_karede_calis(self, delta_zaman: float):
        """Opsiyonel — her frame çağrılabilir (varsayılan: hiçbir şey yapma)"""
        pass
 
 
# ─── OYUN API'Sİ — Modların erişebileceği güvenli arayüz ─
class OyunAPI:
    """
    Modlara sunulan KONTROLLÜ erişim noktası.
    Modlar oyunun iç koduna doğrudan erişemez — sadece
    bu API üzerinden izin verilen işlemleri yapabilir.
    Bu, güvenlik ve stabilite için kritik bir tasarım kararı.
    """
 
    def __init__(self, oyun_durumu):
        self._oyun_durumu = oyun_durumu
        self._olay_dinleyicileri = {}
 
    def yeni_esya_kaydet(self, esya_id: str, esya_verisi: dict):
        """Modların oyuna yeni eşya eklemesine izin ver"""
        self._oyun_durumu.esya_kayitlari[esya_id] = esya_verisi
        print(f"✅ Mod tarafından yeni eşya kaydedildi: {esya_id}")
 
    def olay_dinle(self, olay_adi: str, geri_cagirma_fonksiyonu):
        """
        Modların belirli oyun olaylarına (düşman öldü, seviye atlandı vb.)
        tepki verebilmesi için event sistemi
        """
        if olay_adi not in self._olay_dinleyicileri:
            self._olay_dinleyicileri[olay_adi] = []
        self._olay_dinleyicileri[olay_adi].append(geri_cagirma_fonksiyonu)
 
    def olay_tetikle(self, olay_adi: str, **veri):
        """Oyun motoru tarafından çağrılır — kayıtlı tüm mod dinleyicilerini tetikler"""
        for dinleyici in self._olay_dinleyicileri.get(olay_adi, []):
            try:
                dinleyici(**veri)
            except Exception as hata:
                # KRİTİK: Bir mod hata verirse, tüm oyun çökmemeli!
                print(f"⚠️ Mod hatası (olay: {olay_adi}): {hata}")
 
    def oyuncu_bilgisi_al(self) -> dict:
        """Modlara sadece OKUMA erişimi — yazmaya izin verilmiyor (güvenlik)"""
        return {
            "can": self._oyun_durumu.oyuncu_can,
            "seviye": self._oyun_durumu.oyuncu_seviye,
        }
 
 
# ─── MOD YÜKLEYİCİ ───────────────────────────────────
class ModYukleyici:
    def __init__(self, mod_klasoru: str = "mods/"):
        self.mod_klasoru = mod_klasoru
        self.yuklu_modlar = []
 
    def modlari_tara_ve_yukle(self, oyun_api: OyunAPI):
        """
        mods/ klasöründeki her .py dosyasını güvenli şekilde
        yükleyip mod arayüzünü uygulayan sınıfları bulur
        """
        if not os.path.exists(self.mod_klasoru):
            print(f"ℹ️ Mod klasörü bulunamadı: {self.mod_klasoru}")
            return
 
        for dosya_adi in os.listdir(self.mod_klasoru):
            if dosya_adi.endswith('.py'):
                try:
                    self._mod_dosyasini_yukle(dosya_adi, oyun_api)
                except Exception as hata:
                    print(f"❌ Mod yüklenemedi ({dosya_adi}): {hata}")
                    # Bir mod başarısız olsa bile diğerleri yüklenmeye devam etmeli
 
    def _mod_dosyasini_yukle(self, dosya_adi: str, oyun_api: OyunAPI):
        dosya_yolu = os.path.join(self.mod_klasoru, dosya_adi)
        modul_adi = dosya_adi[:-3]
 
        spec = importlib.util.spec_from_file_location(modul_adi, dosya_yolu)
        modul = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(modul)
 
        # Modülde OyunModu'nu uygulayan sınıfları bul
        for isim in dir(modul):
            nesne = getattr(modul, isim)
            if (isinstance(nesne, type) and issubclass(nesne, OyunModu)
                    and nesne is not OyunModu):
                mod_ornegi = nesne()
                bilgi = mod_ornegi.mod_bilgisi()
                print(f"📦 Mod yükleniyor: {bilgi['isim']} v{bilgi['versiyon']}")
 
                mod_ornegi.yuklendiginde(oyun_api)
                self.yuklu_modlar.append(mod_ornegi)
 
print("✅ Mod sistemi mimarisi tanımlandı!")
print("💡 Bu yapı, güvenlik (izole API), esneklik (event sistemi) ve")
print("   dayanıklılık (bir mod hatası tüm oyunu çökertmiyor) sağlıyor")

🎯 Mod Desteği Tasarımında Kritik Prensipler[/B>

🔹 İzolasyon: Modlar oyunun iç koduna doğrudan erişmemeli — sadece tanımlı API üzerinden
🔹 Hata toleransı: Bir mod çökerse tüm oyun çökmemeli — her mod çağrısı try-catch ile korunmalı
🔹 Dokümantasyon: Mod API'nizi belgelemek, topluluk katılımını doğrudan etkiliyor
🔹 Versiyon uyumluluğu: Oyun güncellemesi modları kırmamalı (veya en azından net bir uyarı vermeli)
🔹 Güvenlik: Modların dosya sistemine, ağa sınırsız erişimi olmamalı — özellikle Workshop gibi otomatik indirme sistemlerinde kritik




💬 KENDİ OYUNUNUZA MOD DESTEĞİ EKLEDİNİZ Mİ? 💬​

Nasıl bir mimari kullandınız? Zorluklarınızı paylaşın! 🔧👇
 

Konuyu görüntüleyenler

Üst