Mod sisteminizi nasıl tasarlamak istediğinize bağlı. İkisini keşfedeceğim.
SDK
Büyük olasılıkla, modderlerinizin sizinle aynı dili kullanmasını ve yansıtma yoluyla modları yüklemesini (veya tercih ettiğiniz dile bağlı olarak benzer şekilde) gereksinim duyarsınız. Bu, açık bir şekilde geç bağlanma yapabilen dilleri sınırlayacağınız anlamına gelir - ve bunu yapabilen iyi bir çok insan vardır (C bile akıllıca bir LoadLibrary
hile ile geç bağlanma yapabilir ). Bir modun diğer modları barındırabildiği bazı meta-modding bile yapabilirsiniz (örn. Komut dosyası modları).
Bu yaklaşımla ilgili ilk sorun içsel durumu gizlemektir. Örneğin, C # alarak bir modder özel üyelere erişmek için basitçe yansıma kullanabilir, C de bunu yapabilir (daha fazla çaba gerekli olmasına rağmen).
İkinci sorun ise barındırıyor. İnsanlar, sistemlerinde çalışan sanal alan bulunmayan yabancı kodları gerçekten sevmiyorlar. En kötü senaryo olarak, bir tohum kutusu ayarlayan bir mod yazabilirsiniz; eğer bu bir ISS'ye kurulursa, itibarlarına ciddi zarar verebilir.
Komut
Modderler mod oluşturmak için Lua gibi bir dil kullanırlar. Yerel kodu çağırabilecek bir dil isteyebilirsiniz (Lua ile arabirim kurmak için); ya da kendi seçim dilinizi kendi dilinizde yazmak zorunda kalacaksınız.
Buradaki ilk sorun, çoğu betik dilinin yorumlanmasıdır; bu, gerçek zamanlı sistemler için kabul edilemeyebilir (ancak LuaJIT'e bakınız); oyunlar gibi.
İronik olarak ikinci sorun hala burada var; (çaba büyük miktarda, şans ve bakım olmadan) bir korumalı alan ortamı olarak tamamen yararsız hale - Ben çok olduğunu hayal kırıklığına uğradım bir örnek olarak Lua alarak 'bombardımanı aşımı' çekirdek / default kütüphanesinde bulunan işlevlere sahiptir bunun zor bu konuda ne kadar sinirlendiğimi canlandırıyor, ancak umarım bu anti-özellikleri eklerken güçlü kokteyller içiyorlar . Kendi dilinizi yuvarladıysanız bunu kolayca önleyebilirsiniz (bakınız: UnrealScript).
Son olarak, bir komut dosyası altyapısı ile etkileşime girme maliyeti engelleyici olabilir - yine bir örnek olarak Lua'yı C #: C # ile birlikte almak, yerel işlevler (P / Invoke aracılığıyla) çağrılırken önemli bir ek yüke sahiptir ve Lua oldukça 'konuşkan' bir API'dir. Eğer 'SDK betiğini tasarlama' yönteminiz ana dilinizle ve betik dili arasında çok fazla sohbet gerektiriyorsa bu sorunlara yol açabilir (C'nin gerçekten bu sorunu yaşamadığını unutmayın). Yine, kendi betik dilinizi yazıp (ve # # MSIL'e derleme durumunda) ve [sanal] ortamınızdaki en hızlı şekilde çalıştırarak bunu atlatabilirsiniz.
Betik esasen birincil kodunuzdan tamamen farklı bir sistemde çalıştığından, dahili duruma erişimi tamamen kontrol edebilirsiniz (daha önce bahsedilen kabuk işlevleriyle bazı süslü şeyler yapmazlarsa).
Sonuç
Biraz kapalı başlıkları saptırmak yaptım, ancak, ne temelde Garner metnin o duvardan can Bunun ne olmalıdır herhangi bir dilde bir moddable oyun yapabilmek (Bunu söylemek girişim olacaktır can ) - ancak bazı dillerde daha fazla çalışmaya yol açabilir. Güvenlik konusunda biraz anal mıyım? Evet, kullanıcı kodu söz konusu olduğunda siz de olmalısınız.