noisiv 1
noisiv
Manwe Work 1
Manwe Work
Bodyguardd 1
Bodyguardd
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Reklam vermek için turkmmo@gmail.com

PrimeCore - Modern Source - x64bit - Multilanguage - CMake - C++20

TR:
DirectX 9Ex İstemcisi • FreeBSD AMD64 Sunucusu • CMake + Ninja • C++20 • Entegre Cython

Proje hakkında

Uzun vadede en çok önem taşıdığına inandığım üç noktaya odaklanılarak geliştirilmiş bir Metin2 projesi olan PrimeCore'u satışa sunuyorum: güncel bir teknik altyapı, kolayca yapılandırılabilen sistemler ve kararlılık.

Bu, eski bir kaynak değildir (tabanı Martysama 5.9'dur) ve yalnızca uzun bir define listesiyle tanıtılan bir sunucu da değildir. Hem server-src hem de client-src CMake'e taşındı; derleme sistemi, sunucunun 64-bit mimarisi, DirectX görüntüleme, istemci yükleme süreci, ışınlanma ve istemci-sunucu senkronizasyonu gibi hassas alanlar yeniden ele alındı.

PrimeCore; oldschool, middleschool veya tamamen özel bir proje için temel olarak kullanılabilir. Projenin asıl değeri, üzerine güvenle geliştirme yapılabilecek altyapısında yatmaktadır.

İletişim
Discord: choroy
b666ca47eaa17561e0c5476f3d920f1e.png

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Sunucu kaynak kodu

• Sunucu kaynak kodu CMake ve C++20 standardını kullanır.
• Önerilen derleme ortamı FreeBSD 15/15.1 AMD64'tür.
• Game ve DB doğrudan 64-bit olarak derlenir. Bu, 64-bit işletim sistemi üzerinde çalışan bir 32-bit derleme değildir.
• Derleme Ninja ile yapılır ve betik, bağlantı aşamasından önce önemli kütüphanelerin ELF64 olduğunu doğrular.
• Standart sunucu yapılandırması RelWithDebInfo'dur: canlı kullanım için optimize edilmiştir ve aynı zamanda çökme analizi için gerekli sembolleri içerir.
• CMake içerisinde isteğe bağlı AddressSanitizer, ccache ve LLD linker desteği bulunur.
• Derleme kayıtları genel çıktı, uyarılar ve hatalar olarak ayrılır. Bu yapı, projede birden fazla geliştirici çalıştığında önemli kolaylık sağlar.

Sunucu derleme örneği
Kod:
cd metin2-server-src
sh build_ninja.sh

Betik projeyi yapılandırır, x64 bağımlılıklarını doğrular, game/db dosyalarını derler ve oluşan ikili dosyaları kontrol eder.

İstemci kaynak kodu

• İstemci kaynak kodu CMake, Visual Studio 2022 ve C++20 kullanır.
• Kodun hassas bölümleri modern uyumluluk ve 64-bit güvenli veri tipleri için temizlenmiştir. Oyunculara dağıtılan launcher ise bilinçli olarak Win32/x86 derlenir. Bu tercih, Metin2 oyuncularının kullandığı klasik sistem ve bileşenlerle uyumluluğu korur.
• Grafik motoru Direct3D 9Ex üzerinde çalışır.
• Mevcut yapılandırmada Python 2.7 statik olarak bağlanmıştır.
• Pack sistemi, WoM2/WoM3 kaynağında bulunan PAK Archiver sistemidir. Root pack normal şekilde veya canlı sunucular için önerilen Cython biçiminde arşivlenebilir.

İstemci yapılandırmaları

metin2_debug
- hata ayıklama ve kontroller için.

metin2_dev - günlük testler için hızlı ve optimize edilmiş derleme; proje profillerini etkin tutar.

metin2_cython - release optimizasyonlarına sahip dağıtım yapılandırması. Cython, Python dosyalarını doğrudan
Kod:
root
ve
Kod:
root/uiscript
klasörlerinden okur, gerekli kaynakları üretir ve derlemeye dahil eder. Son root pack içerisinde
Kod:
.py
veya
Kod:
.pyc
dosyaları bulunmaz.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

• Buton durumları arasındaki devamlılık dahil olmak üzere WebP görselleri için UI desteği.
• Arayüz pencereleri için modernleştirilmiş geçiş ve clipping sistemi.
• Loading phase işlemleri ölçülebilir adımlara ayrılmış ve profiler üzerinden takip edilebilir hâle getirilmiştir; böylece teşhis edilemeyen tek parça donmaların önüne geçilir.

Görsel kalite ve grafik kontrolü

Anisotropic OFF / 2x / 4x / 8x / 16x • Gerçek zamanlı ayarlanabilir keskinlik​

Direct3D 9Ex'e geçiş yalnızca kaynak kodundaki teknik bir değişiklik değildir. İstemcide, her oyuncunun görüntü netliği ile performans arasında kendi dengesini seçebilmesini sağlayan entegre grafik ayarları da bulunur.

• Anizotropik filtreleme OFF, 2x, 4x, 8x veya 16x olarak ayarlanabilir. Özellikle arazi ve harita nesnelerinde, uzaktan veya açılı bakılan dokuların netliğini artırır.

• İstemci, ekran kartının desteklediği en yüksek seviyeyi algılar ve desteklenmeyen seçenekleri otomatik olarak devre dışı bırakır.

• Keskinlik gerçek zamanlı olarak 0.00 ile 0.30 arasında ayarlanabilir. Daha net bir görüntü için harici filtre veya programa ihtiyaç duymadan istemcinin entegre post-processing sistemi kullanılır.

• Değerler istemci yapılandırmasına kaydedilir ve bir sonraki açılışta otomatik olarak uygulanır.


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Ana sistemler

Oyun içi Wikipedia

• Özel bir "Wikipedia bağlantısı" özelliği bulunur. Kategori, eşya veya yaratık sayfasının bağlantısı kopyalanarak sohbetten ya da özel mesajla başka bir oyuncuya gönderilebilir.
• Özel üretim kategorisi.

Görseller:

Dungeon Info + Dungeon Creator

• Zindan penceresi gerekli seviye, seviye sınırı, giriş, bekleme süresi, giriş bileti, ırk, element ve boss bilgilerini gösterir. Oyuncu zindan girişindeki NPC'ye ışınlanabilir veya belirli bir Yang ücreti (5.000.000) karşılığında kanallar arası doğrudan zindana girebilir, bossun Wikipedia sayfasını açabilir ve kalan süreyi gerçek zamanlı olarak görebilir. Liste yeniden sıralanabilir ve ilgilenilmeyen zindanlar gizlenebilir.
• Sistem; grup gereksinimleri, bekleme süresi, yeniden katılma, skip-pass (doğrudan bossa giriş), giriş/çıkış koordinatları ve yapılandırılabilir aşamaları destekler.
• Haritaya geçici efektler doğrudan yapılandırılabilir. Örneğin oyuncuya yolu göstermek için ok efektleri yerleştirilebilir ve oyuncu yaklaştığında otomatik olarak kaybolmaları sağlanabilir.
• Zindan tamamlandığında oyuncuya geçici bonus verilebilir; bonus ve süresi zindan yapılandırmasından belirlenir.
• Mevcut aşama türleri:

Kod:
KILL_REGEN - Aşamada oluşturulan tüm hedefleri öldür.
DROP_KEY - Gerekli anahtar düşene kadar yaratıkları öldür ve mühürleri açmak için anahtarı kullan (birden fazla mühür desteklenir).
USE_ITEM - Yaratıklardan gerekli eşyayı elde et ve aşamayı tamamlamak için kullan. Düşürme ve başarı oranları yapılandırılabilir.
FIND_REAL_KEY - Gerçek ve sahte anahtarların arasından doğru anahtarı bul ve mührü açmak için kullan.
KILL_IN_ORDER - Taşları rastgele oluşturulan doğru sırayla yok et. Yanlış taşın yok edilmesi aşamayı sıfırlar.
NPC_TALK - Yapılandırılmış NPC ile konuş ve devam etmek için diyaloğu tamamla.
KILL_RIGHT_STONE - Gerçek taşı yok et.
KILL_RIGHT_MONSTER - Gerçek yaratığı öldür.
STATUE_PERCENT - Tüm heykellerin HP'sini yapılandırılmış eşiklere indir. Her eşik yeni bir alt aşama başlatır.
PROGRESSIVE_DOORS - Her kapı çiftini sırayla açmak için alt aşamaları doğru sırada tamamla (Razador).


Şeytan Kulesi yapılandırma örneği:
Kod:
Group DevilTower
{
    npc_entrance    20348
    level_min       40
    level_max       90
    ticket          30320 1
    group           false
    cooldown        1800
    cooldown_flag   "devil_tower.cooldown"
    warp_inside     140427 855947
    warp_outside    590329 110966
    rejoin          true
    time            1800
    skip_pass       30025
    skip_pass_max   8
    skip_pass_warp  140427 855947
    affect          APPLY_ATTBONUS_MONSTER 10 1800

    Group Floor_1
    {
        KILL_REGEN  "share/locale/international/dungeon_regen/devil_tower/deviltower1_regen_stone.txt"
        REGEN_FILE  "share/locale/international/dungeon_regen/devil_tower/deviltower1_regen.txt"
        MISSION     dungeon_lang.DEVIL_TOWER_DESTROY_POWER_STONE
        WARP        202 404 5
    }

    Group Floor_2
    {
        KILL_REGEN  "share/locale/international/dungeon_regen/devil_tower/deviltower2_regen.txt"
        MISSION     dungeon_lang.DEVIL_TOWER_KILL_ALL
        WARP        200 407
    }

    Group Floor_3
    {
        KILL_REGEN  "share/locale/international/dungeon_regen/devil_tower/deviltower3_regen.txt"
        REGEN_FILE  "share/locale/international/dungeon_regen/devil_tower/deviltower3_regen_mobs.txt"
        MISSION     dungeon_lang.DEVIL_TOWER_DEFEAT_PROUD_DEMON
        WARP        372 646
    }

    Group Floor_4
    {
        KILL_REGEN  "share/locale/international/dungeon_regen/devil_tower/deviltower4_regen.txt"
        MISSION     dungeon_lang.DEVIL_TOWER_DESTROY_DEVIL_STONE
    }

    Group Floor_4-1
    {
        KILL_RIGHT_STONE  "share/locale/international/dungeon_regen/devil_tower/deviltower4_regen_stone.txt"
        MISSION     dungeon_lang.DEVIL_TOWER_DESTROY_REAL_STONE
        WARP        374 419
    }

    Group Floor_5
    {
        DROP_KEY      "share/locale/international/dungeon_regen/devil_tower/deviltower5_regen.txt"
        KEY           50084 2
        SEAL          20073 361 411 5
        SEAL          20073 380 392 5
        SEAL          20073 410 391 5
        SEAL          20073 428 442 5
        SEAL          20073 431 411 5
        SEAL          20073 410 463 5
        SEAL          20073 382 463 5
        SEAL          20073 361 442 5
        INFO_KEY      dungeon_lang.UNLOCK_SEAL
        WARP          373 184
    }

    Group Floor_6
    {
        KILL_REGEN  "share/locale/international/dungeon_regen/devil_tower/deviltower6_regen.txt"
        REGEN_FILE  "share/locale/international/dungeon_regen/devil_tower/deviltower6_regen_mobs.txt"
        MISSION     dungeon_lang.DEVIL_TOWER_DESTROY_POWER_STONE
        WARP        629 452
    }

    Group Floor_7
    {
        USE_ITEM       "share/locale/international/dungeon_regen/devil_tower/deviltower7_regen.txt"
        ITEM           30302 20
        SUCCESS_CHANCE 100
    }

    Group Floor_8
    {
        FIND_REAL_KEY "share/locale/international/dungeon_regen/devil_tower/deviltower8_regen.txt"
        REAL_KEY      30304 1
        FAKE_KEY      30303 5
        SEAL          20390 599 400 5
        INFO_KEY_REAL dungeon_lang.INFO_KEY_REAL
        INFO_KEY_FAKE dungeon_lang.INFO_KEY_FAKE
        WARP          623 159
    }

    Group Floor_9
    {
        KILL_REGEN  "share/locale/international/dungeon_regen/devil_tower/deviltower9_regen.txt"
        REGEN_FILE  "share/locale/international/dungeon_regen/devil_tower/deviltower8_regen.txt"
        MISSION     dungeon_lang.DEVIL_TOWER_DESTROY_POWER_STONE
    }
}

Görseller:

Biyolog

• Biyolog görevleri sunucu tarafında JSON ile yapılandırılır: minimum seviye, gerekli eşya, miktar, başarı oranı, bekleme süresi, bonuslar ve ödüller. Sistem hem sabit ödülleri (bonusları) hem de oyuncunun bonus seçmesini destekler.

Yapılandırma örneği:
Kod:
    {
      "index": 0,
      "cooldown": 600,
      "success_chance": 60,
      "choose_bonus": false,
      "minimum_level": 30,
      "time_item": 70030,
      "chance_item": 71035,
      "required_item": { "vnum": 30006, "count": 10 },
      "reward_bonuses": [
        { "apply": 54, "value": 60 }
      ],
      "reward_items": []
    },
    {
      "index": 1,
      "cooldown": 600,
      "success_chance": 60,
      "choose_bonus": false,
      "minimum_level": 40,
      "time_item": 70030,
      "chance_item": 71035,
      "required_item": { "vnum": 30047, "count": 15 },
      "reward_bonuses": [
        { "apply": 63, "value": 5 }
      ],
      "reward_items": []
    },

Görseller:

Cube Renewal

• Modern üretim arayüzü.
• Üretim penceresindeki bir eşyaya sol tıklandığında eşyanın Wikipedia sayfası doğrudan açılır. Bu özellik eşya yükseltme penceresinde de çalışır.
• Bir eşyaya sağ tıklandığında eşya, üretim penceresinden doğrudan Search Shop içerisinde aranır. Bu özellik eşya yükseltme penceresinde de çalışır.

Görseller:

Horse Manager

• At gelişimi artık bir quest içerisine bağlı değildir. Seviyeler, bonuslar, malzemeler, ücret, minimum oyuncu seviyesi, başarı oranı, bekleme süresi ve görevler sunucu tarafında JSON ile yapılandırılır.
• Görevler belirli sayıda yaratık öldürmeyi gerektirebilir ve isteğe bağlı süre sınırına sahip olabilir. Arayüz ilerlemeyi, bir sonraki bonusu, malzemeleri ve tüm gereksinimleri gösterir. Ayrıca %100 başarı sağlayan ve deneme bekleme süresini kaldıran isteğe bağlı bir eşya da dahildir.

Görseller:

Otomatik Toplama + Loot Filter

• Otomatik Toplama farklı sürelerle veya kalıcı olarak verilebilir. Oyuncu çevrimdışıyken de süresi azalmaya devam eder. Oyun ayarlarından veya affect simgesine tıklanarak açılıp kapatılabilir; iki durum senkronizedir ve simge özelliğin açık ya da kapalı olduğunu görsel olarak gösterir.
• Aynı anda birden fazla Otomatik Toplama etkinleştirilemez. Özelliğin kapatılması süresini durdurmaz.
• Otomatik Toplama, loot filtresine uyar.

Görseller:

Switchbot

• Switchbot, standart ücretsiz özelliklerin yanında premium oyuncular için ek özellikler içerir.
• 5 slot (2 ücretsiz, 3 premium).
• 5 alternatif (1 ücretsiz, 4 premium).
• Ayarlanabilir hız; yalnızca premium oyuncular hızı değiştirebilir, premium olmayan oyuncular standart hızı kullanır.
• 100, 500 veya 1.000 efsun nesnesiyle anlık bonus değiştirme özelliği (yalnızca premium).
• Bonus değiştirmek için kullanılacak eşyanın seçimi (Efsun Nesnesi, Yeşil Efsun ve diğerleri).
• Güvenli mod: Switchbot durana kadar değiştirilen bonuslara ilişkin bilgiler oyuncuya gönderilmez.

Görseller:

Offline Shop / Ikarus Shop v2

• Temel sistemin büyük bir bölümü yeniden yazılmış, işlevsel geliştirmeler yapılmış ve arayüz değiştirilmiştir.
• Çevrimdışı mağazaya özel başlık verilebilir.
• Çevrimdışı mağaza deposu kaldırılmıştır.
• Kendi çevrimdışı mağazanızın üzerinde, yalnızca sizin görebileceğiniz ve mağazanın size ait olduğunu belirten bir efekt bulunur.

Görseller:

Battle Pass

• Günlük ve haftalık görevler, sıfırlanmaya kalan süre, ücretsiz ve premium ödüller ve görevleri yeniden belirleme seçeneği. Oyuncu tamamlanmış görevleri filtreleyebilir ve ödüllerini doğrudan arayüzden alabilir.

Görseller:

Global Challenges

• Challenge hedefleri; seviye, zindan, eşya elde etme ve yükseltme, manuel veya Switchbot ile getirilen bonuslar, kuşaklar ve simya ilerlemesini takip edebilir. Challenge doğrulaması yalnızca eşyanın son değerine göre değil, işlemin gerçekleştiği kaynakta yapılır; bu da istismar ihtimallerini azaltır.

Görseller:

Ranking System

• Sınıf filtreleri, seviye aralıkları, periyodik sıfırlamalar ve ödüller içeren yapılandırılabilir sıralamalar. Mevcut yapılandırmada seviye, Metin Taşlarına verilen hasar, yok edilen Metin Taşları, öldürülen bosslar, tamamlanan zindanlar, efsunlanan eşyalar, birleştirilen kuşaklar ve madencilik gibi kategoriler bulunur.

Görseller:

Event Manager

• Bosslardan, Metin Taşlarından ve balıkçılıktan çift düşürme; Ay Işığı Define Sandığı ve Altıgen Hazine Sandığı etkinlikleri için örnekler dahildir.

Görseller:

Oyun içi Livestream

• Canlı yayınları doğrudan oyun içinde tanıtmak için istemci/sunucu sistemi. Kendi penceresine ve ekranda aktif etkinliği gösteren etkinlik takvimi göstergesine benzer bir widget'a sahiptir. Widget ayarlardan gizlenebilir. Her yayın için istemcide manuel değişiklik gerektirmeden etkinlikler, partnerler ve içerik üreticileri için kullanılabilir.

Görseller:

Özel envanterler

• Yükseltme malzemeleri, kitaplar, efsun nesneleri, sandıklar ve kostümler için ayrı envanterler; depo ve Nesne Market deposu desteği de dahildir.

Görseller:

Drop Info + DPS

• Hedef penceresinde faydalı bilgiler ve hasar ölçümü.

Görseller:

Çoklu dil desteği

• Oyun içinden dil değiştirme ve 16 locale desteği: Arapça, Çekçe, Almanca, Danca, İngilizce, İspanyolca, Fransızca, Yunanca, Macarca, İtalyanca, Hollandaca, Lehçe, Portekizce, Romence, Rusça ve Türkçe. Ülke bayrakları ve anonim mod da dahildir.

Animasyonlu lonca sembolleri

• JPG, GIF ve WebP yükleme desteği. Mevcut uygulama sembol başına en fazla 32 kareyi destekler; protokol ise 128 kareye kadar hazırdır. Atlas kapasitesi 21 görsele çıkarılmıştır.

Arkadaş listesi

• Ek bilgiler ve modern tasarım.
• Oyuncular "Favoriler" listesine eklenebilir ve özel favoriler bölümünde en üstte görünür.
• "GM" butonu GM Support'a özel mesaj açar. Oyuncu mesaj gönderdiğinde tüm yetkili ekip üyeleri "Support - oyuncuadı" başlıklı bir PM alır; oyuncunun konuşmasına herhangi bir yetkili ve birden fazla ekip üyesi cevap verebilir.

Görseller:

Minimap
• Bosslar artık hayattayken yeşil, öldürüldükten sonra kırmızı simgeyle minimap üzerinde görünür. Boss öldüğünde gerçek yeniden doğma süresi geri sayım olarak gösterilir.
• Minimap üzerindeki boss simgesine sol tıklamak bossun Wikipedia sayfasını açar.

Görseller:

Blend

• Blend sistemi aşağıdaki alt türlerle genişletilmiştir:
• NORMAL_BLEND - Metin2'nin standart blend davranışı.
• USE_BLEND - Bonuslar proto içerisindeki eşya apply değerleriyle, süre Value1 ve grup Value0 ile yapılandırılır. Grup, aynı gruptaki başka bir eşyanın eş zamanlı etkinleştirilmesini engeller. Bu eşyalar kullanıldığında kaybolur ve UI affect listesinde gösterilir.
• TOGGLE_BLEND - Bonuslar proto içerisindeki eşya apply değerleriyle, grup ise Value1 ile yapılandırılır. Grup, aynı gruptaki başka bir eşyanın aynı anda etkin olmasını engeller. Süre standart TIMER_BASED_ON_WEAR + süre yapılandırmasını kullanır. Eşyalar envanterden açılıp kapatılabilir; süreli iki özdeş eşya, süreleri birleştirilmiş tek bir eşyaya dönüştürülebilir.

Binek / Pet

• Binekler ve petler doğrudan envanterden etkinleştirilir; ekipman veya kostüm slotu kullanmaz.

Balıkçılık

• Balıkçılık modern bir mini oyun olarak yeniden tasarlanmıştır.
• Oyuncu balığı sarı alan içerisinde üç kez yakalamalıdır. Üç başarısız denemeden sonra balıkçılık sona erer.
• Hem genel balık yakalama oranı hem de balıkların ayrı ayrı şansları fishing.lua içerisinde yapılandırılır.
• fishing.txt yerine fishing.lua kullanılmaktadır.

fishing.lua örneği:
Kod:
FishingConfig = {
    general_catch_chance = 100,
    fishes = {
        { vnum = 50002, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 27992, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 27993, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 27994, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 27802, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 27803, dead_vnum = 27833, grill_vnum = 27863, chance = 10 },
        { vnum = 27804, dead_vnum = 27834, grill_vnum = 27864, chance = 10 },
        { vnum = 27805, dead_vnum = 27835, grill_vnum = 27865, chance = 10 },
        { vnum = 27806, dead_vnum = 27836, grill_vnum = 27866, chance = 10 },
        { vnum = 27807, dead_vnum = 27837, grill_vnum = 27867, chance = 10 },
        { vnum = 27808, dead_vnum = 27838, grill_vnum = 27868, chance = 10 },
        { vnum = 27809, dead_vnum = 27839, grill_vnum = 27869, chance = 10 },
        { vnum = 27810, dead_vnum = 27840, grill_vnum = 27870, chance = 10 },
        { vnum = 27811, dead_vnum = 27841, grill_vnum = 27871, chance = 10 },
        { vnum = 27812, dead_vnum = 27842, grill_vnum = 27872, chance = 10 },
        { vnum = 27813, dead_vnum = 27843, grill_vnum = 27873, chance = 10 },
        { vnum = 27814, dead_vnum = 27844, grill_vnum = 27874, chance = 10 },
        { vnum = 27815, dead_vnum = 27845, grill_vnum = 27875, chance = 10 },
        { vnum = 27816, dead_vnum = 27846, grill_vnum = 27876, chance = 10 },
        { vnum = 27817, dead_vnum = 27847, grill_vnum = 27877, chance = 10 },
        { vnum = 27818, dead_vnum = 27848, grill_vnum = 27878, chance = 10 },
        { vnum = 27819, dead_vnum = 27849, grill_vnum = 27879, chance = 10 },
        { vnum = 27820, dead_vnum = 27850, grill_vnum = 27880, chance = 10 },
        { vnum = 27821, dead_vnum = 27851, grill_vnum = 27881, chance = 10 },
        { vnum = 27822, dead_vnum = 27852, grill_vnum = 27882, chance = 10 },
        { vnum = 27823, dead_vnum = 27853, grill_vnum = 27883, chance = 10 },
        { vnum = 70201, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70202, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70203, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70204, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70205, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70206, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70048, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70049, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70050, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70051, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 80008, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 50009, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 50008, dead_vnum = 0, grill_vnum = 0, chance = 10 },
    }
}

Görseller:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

• Fiyat: 300€
• Sunucu güncellenmeye devam edeceği için fiyat zaman içerisinde değişebilir. Bu konu, yeni eklenen veya daha önce belirtilmemiş özelliklerle düzenli olarak güncellenecektir.
• Daha fazla bilgi için Discord üzerinden benimle iletişime geçebilirsiniz: choroy

EN:
DirectX 9Ex Client • FreeBSD AMD64 Server • CMake + Ninja • C++20 • Integrated Cython

About the project

I am offering PrimeCore for sale, a Metin2 project developed around the three things that, in my experience, matter most in the long run: an up-to-date technical foundation, easily configurable systems and stability.

This is not an old source base (it is based on Martysama 5.9), nor is it a server presented through nothing more than a long list of defines. Both server-src and client-src were migrated to CMake, while several sensitive areas were reworked: the build process, the server's 64-bit architecture, DirectX rendering, client loading, warps and client-server synchronization.

PrimeCore can be used as the foundation for an old-school, middle-school or fully custom project. Its real value lies in the foundation you can continue building on.

Contact
Discord: choroy
b666ca47eaa17561e0c5476f3d920f1e.png

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Server source

• The server source uses CMake and the C++20 standard.
• The recommended build environment is FreeBSD 15/15.1 AMD64.
• Game and DB are compiled natively as 64-bit binaries. This is not a 32-bit build running on a 64-bit operating system.
• Compilation uses Ninja, and the script verifies that the important libraries are ELF64 before linking.
• The standard server configuration is RelWithDebInfo: optimized for production use while retaining useful symbols for crash investigation.
• CMake includes optional support for AddressSanitizer, ccache and the LLD linker.
• Build logs are separated into general output, warnings and errors, which is useful when several developers work on the project.

Server build example
Kod:
cd metin2-server-src
sh build_ninja.sh

The script configures the project, verifies the x64 dependencies, compiles game/db and validates the resulting binaries.

Client source

• The client source uses CMake, Visual Studio 2022 and C++20.
• Sensitive areas of the code were cleaned up for modern compatibility and 64-bit-safe types, while the launcher distributed to players is intentionally compiled as Win32/x86. This preserves compatibility with the systems and classic components still used by Metin2 players.
• The graphics engine runs on Direct3D 9Ex.
• Python 2.7 is statically linked in the current configuration.
• The pack system is the same PAK Archiver found in the WoM2/WoM3 source. The root pack can be archived normally or, as recommended for a live server, built in its Cython version.

Client configurations

metin2_debug
- intended for debugging and validation.

metin2_dev - a fast, optimized build for daily testing which keeps the project profilers enabled.

metin2_cython - the distribution configuration with release optimizations. Cython reads the Python files directly from
Kod:
root
and
Kod:
root/uiscript
, generates the required sources and includes them in the build. The final root pack is created without
Kod:
.py
or
Kod:
.pyc
files.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

• UI support for WebP images, including continuity between button states.
• Modernized transitions and clipping for interface windows.
• Loading-phase work is split into measurable steps and exposed in the profiler instead of remaining an undiagnosable pause.

Visual quality and graphics control

Anisotropic OFF / 2x / 4x / 8x / 16x • Real-time adjustable sharpness​

Moving to Direct3D 9Ex is more than a technical source change. The client also provides integrated graphics settings that allow every player to choose the right balance between image clarity and performance.

• Anisotropic filtering can be set to OFF, 2x, 4x, 8x or 16x, improving the clarity of textures viewed from a distance or at an angle, particularly terrain and map objects.

• The client detects the maximum level supported by the graphics card and automatically disables unsupported options.

• Sharpness can be adjusted in real time from 0.00 to 0.30, using the client's integrated post-processing for a clearer image without external filters or programs.

• Values are saved in the client configuration and automatically restored at the next launch.


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Main systems

In-game Wikipedia

• Includes a custom "Wikipedia link" feature. A player can copy a category, item or monster page link and send it through chat or whisper to another player.
• Dedicated crafting category.

Images:

Dungeon Info + Dungeon Creator

• The dungeon window displays the required level, level limit, entrance, cooldown, pass, race, element and boss information. Players can teleport to the entrance NPC or directly enter the dungeon cross-channel for a Yang fee (5,000,000), open the boss page in Wikipedia and view the remaining time in real time. The list can be reordered and unwanted dungeons can be hidden.
• The system supports party requirements, cooldowns, rejoining, skip passes (direct boss entry), entrance/exit coordinates and configurable stages.
• Temporary map effects can be configured directly. For example, arrow effects can guide the player and disappear automatically as the player approaches them.
• Players can receive a temporary bonus after completing a dungeon; both the bonus and its duration are set in the dungeon configuration.
• Available stage types:

Kod:
KILL_REGEN - Kill every target spawned during the stage.
DROP_KEY - Kill monsters until the required key drops, then use it to open the seals (multiple seals are supported).
USE_ITEM - Obtain the required item from monsters and use it to complete the stage. Drop and success chances are configurable.
FIND_REAL_KEY - Find the genuine key among real and fake keys, then use it to open the seal.
KILL_IN_ORDER - Destroy the stones in the correct, randomly generated order. Destroying the wrong stone resets the stage.
NPC_TALK - Speak to the configured NPC and complete its dialogue to continue.
KILL_RIGHT_STONE - Destroy the genuine stone.
KILL_RIGHT_MONSTER - Kill the genuine monster.
STATUE_PERCENT - Lower every statue to the configured HP thresholds. Each threshold starts a new sub-stage.
PROGRESSIVE_DOORS - Complete the sub-stages in order to progressively open each pair of doors (Razador).


Demon Tower configuration example:
Kod:
Group DevilTower
{
    npc_entrance    20348
    level_min       40
    level_max       90
    ticket          30320 1
    group           false
    cooldown        1800
    cooldown_flag   "devil_tower.cooldown"
    warp_inside     140427 855947
    warp_outside    590329 110966
    rejoin          true
    time            1800
    skip_pass       30025
    skip_pass_max   8
    skip_pass_warp  140427 855947
    affect          APPLY_ATTBONUS_MONSTER 10 1800

    Group Floor_1
    {
        KILL_REGEN  "share/locale/international/dungeon_regen/devil_tower/deviltower1_regen_stone.txt"
        REGEN_FILE  "share/locale/international/dungeon_regen/devil_tower/deviltower1_regen.txt"
        MISSION     dungeon_lang.DEVIL_TOWER_DESTROY_POWER_STONE
        WARP        202 404 5
    }

    Group Floor_2
    {
        KILL_REGEN  "share/locale/international/dungeon_regen/devil_tower/deviltower2_regen.txt"
        MISSION     dungeon_lang.DEVIL_TOWER_KILL_ALL
        WARP        200 407
    }

    Group Floor_3
    {
        KILL_REGEN  "share/locale/international/dungeon_regen/devil_tower/deviltower3_regen.txt"
        REGEN_FILE  "share/locale/international/dungeon_regen/devil_tower/deviltower3_regen_mobs.txt"
        MISSION     dungeon_lang.DEVIL_TOWER_DEFEAT_PROUD_DEMON
        WARP        372 646
    }

    Group Floor_4
    {
        KILL_REGEN  "share/locale/international/dungeon_regen/devil_tower/deviltower4_regen.txt"
        MISSION     dungeon_lang.DEVIL_TOWER_DESTROY_DEVIL_STONE
    }

    Group Floor_4-1
    {
        KILL_RIGHT_STONE  "share/locale/international/dungeon_regen/devil_tower/deviltower4_regen_stone.txt"
        MISSION     dungeon_lang.DEVIL_TOWER_DESTROY_REAL_STONE
        WARP        374 419
    }

    Group Floor_5
    {
        DROP_KEY      "share/locale/international/dungeon_regen/devil_tower/deviltower5_regen.txt"
        KEY           50084 2
        SEAL          20073 361 411 5
        SEAL          20073 380 392 5
        SEAL          20073 410 391 5
        SEAL          20073 428 442 5
        SEAL          20073 431 411 5
        SEAL          20073 410 463 5
        SEAL          20073 382 463 5
        SEAL          20073 361 442 5
        INFO_KEY      dungeon_lang.UNLOCK_SEAL
        WARP          373 184
    }

    Group Floor_6
    {
        KILL_REGEN  "share/locale/international/dungeon_regen/devil_tower/deviltower6_regen.txt"
        REGEN_FILE  "share/locale/international/dungeon_regen/devil_tower/deviltower6_regen_mobs.txt"
        MISSION     dungeon_lang.DEVIL_TOWER_DESTROY_POWER_STONE
        WARP        629 452
    }

    Group Floor_7
    {
        USE_ITEM       "share/locale/international/dungeon_regen/devil_tower/deviltower7_regen.txt"
        ITEM           30302 20
        SUCCESS_CHANCE 100
    }

    Group Floor_8
    {
        FIND_REAL_KEY "share/locale/international/dungeon_regen/devil_tower/deviltower8_regen.txt"
        REAL_KEY      30304 1
        FAKE_KEY      30303 5
        SEAL          20390 599 400 5
        INFO_KEY_REAL dungeon_lang.INFO_KEY_REAL
        INFO_KEY_FAKE dungeon_lang.INFO_KEY_FAKE
        WARP          623 159
    }

    Group Floor_9
    {
        KILL_REGEN  "share/locale/international/dungeon_regen/devil_tower/deviltower9_regen.txt"
        REGEN_FILE  "share/locale/international/dungeon_regen/devil_tower/deviltower8_regen.txt"
        MISSION     dungeon_lang.DEVIL_TOWER_DESTROY_POWER_STONE
    }
}

Images:

Biologist

• Biologist missions are configured server-side through JSON: minimum level, required item, quantity, success chance, cooldown, bonuses and rewards. The system supports both fixed rewards (bonuses) and allowing the player to choose a bonus.

Configuration example:
Kod:
    {
      "index": 0,
      "cooldown": 600,
      "success_chance": 60,
      "choose_bonus": false,
      "minimum_level": 30,
      "time_item": 70030,
      "chance_item": 71035,
      "required_item": { "vnum": 30006, "count": 10 },
      "reward_bonuses": [
        { "apply": 54, "value": 60 }
      ],
      "reward_items": []
    },
    {
      "index": 1,
      "cooldown": 600,
      "success_chance": 60,
      "choose_bonus": false,
      "minimum_level": 40,
      "time_item": 70030,
      "chance_item": 71035,
      "required_item": { "vnum": 30047, "count": 15 },
      "reward_bonuses": [
        { "apply": 63, "value": 5 }
      ],
      "reward_items": []
    },

Images:

Cube Renewal

• Modern crafting interface.
• Left-clicking an item opens its Wikipedia page directly from the crafting window. This also works in the item refinement window.
• Right-clicking an item searches for it in Search Shop directly from the crafting window. This also works in the item refinement window.

Images:

Horse Manager

• Horse progression is no longer locked inside a quest. Levels, bonuses, materials, cost, minimum player level, success chance, cooldown and missions are configured server-side through JSON.
• Missions can require killing a specific number of monsters and may have an optional time limit. The interface displays progress, the next bonus, materials and every requirement. An optional item that guarantees 100% success and removes the attempt cooldown is also included.

Images:

Auto Pickup + Loot Filter

• Auto Pickup can be granted for different durations or permanently. Its duration continues to decrease while the player is offline. It can be enabled or disabled either from the game settings or by clicking its affect icon; both states are synchronized and the icon visually indicates whether the feature is enabled or disabled.
• Multiple Auto Pickup items cannot be activated simultaneously. Disabling the feature does not pause its duration.
• Auto Pickup respects the loot filter.

Images:

Switchbot

• The Switchbot includes standard free features and additional features for premium players.
• 5 slots (2 free and 3 premium).
• 5 alternatives (1 free and 4 premium).
• Adjustable speed; only premium players can change it, while non-premium players use the standard speed.
• Instant bonus switching in batches of 100, 500 or 1,000 enchant items (premium only).
• Selection of the item used to change bonuses (Enchant Item, Green Magic and others).
• Safe mode: information about changed bonuses is withheld until the Switchbot stops.

Images:

Offline Shop / Ikarus Shop v2

• A large portion of the base system was rewritten, with both functional improvements and a redesigned interface.
• Offline shops can have a custom title.
• The offline shop storage was removed.
• On your own offline shop, only you will see the effect that identifies it as yours.

Images:

Battle Pass

• Daily and weekly missions, a countdown to reset, free and premium rewards and mission rerolls. Players can filter completed missions and claim rewards directly from the interface.

Images:

Global Challenges

• Challenge objectives can track levels, dungeons, item acquisition and refinement, bonuses obtained manually or through the Switchbot, sashes and alchemy. Challenge progress is validated at the source of each action rather than only from the item's final value, reducing the potential for exploits.

Images:

Ranking System

• Configurable rankings with class filters, level ranges, periodic resets and rewards. The current configuration includes categories such as level, damage dealt to Metin Stones, Metin Stones destroyed, bosses killed, dungeons completed, items enchanted, sashes combined and mining.

Images:

Event Manager

• Includes examples for double drops from bosses, Metin Stones and fishing, as well as Moonlight Treasure Chests and Hexagonal Treasure Chests.

Images:

In-game Livestream

• A client/server system for promoting livestreams directly in-game, with its own window and a widget similar to the event-calendar indicator shown on the screen. The widget can be hidden from settings. It is useful for events, partners and content creators without requiring manual client changes for every stream.

Images:

Special inventories

• Separate inventories for upgrade materials, books, enchant items, chests and costumes, including support for the warehouse and Item Shop storage.

Images:

Drop Info + DPS

• Useful target information and damage measurement.

Images:

Multilanguage

• In-game language switching and support for 16 locales: Arabic, Czech, German, Danish, English, Spanish, French, Greek, Hungarian, Italian, Dutch, Polish, Portuguese, Romanian, Russian and Turkish. Country flags and an anonymous mode are included.

Animated guild emblems

• Upload support for JPG, GIF and WebP. The current implementation supports up to 32 frames per emblem, while the protocol is prepared for up to 128. Atlas capacity has been extended to 21 images.

Friends list

• Additional information and a modern design.
• Players can be added to "Favorites" and will appear first in a dedicated favorites list.
• A "GM" button opens a whisper to GM Support. When the player sends a message, every staff member receives a "Support - playername" PM; any number of staff members can reply inside the player's conversation.

Images:

Minimap
• Bosses now appear on the minimap with a green icon while alive and a red icon after being killed. When a boss is dead, its real respawn time is displayed as a countdown.
• Left-clicking a boss icon on the minimap opens that boss's Wikipedia page.

Images:

Blend

• The Blend system was extended with the following subtypes:
• NORMAL_BLEND - the standard Metin2 blend behavior.
• USE_BLEND - Bonuses are configured through the item's apply values in proto, duration through Value1 and group through Value0. The group prevents another item from the same group from being activated simultaneously. These items disappear when used and are displayed in the UI affect list.
• TOGGLE_BLEND - Bonuses are configured through the item's apply values in proto and the group through Value1. The group prevents another item from the same group from being active at the same time. Duration uses the standard TIMER_BASED_ON_WEAR + time configuration. These items can be toggled from the inventory, and two identical timed items can be merged into a single item with their durations combined.

Mount / Pet

• Mounts and pets can be activated directly from the inventory and do not occupy an equipment or costume slot.

Fishing

• Fishing was redesigned as a modern minigame.
• The player must catch the fish inside the yellow area three times. Fishing ends after three failed attempts.
• Both the general catch chance and the individual fish chances are configured in fishing.lua.
• fishing.txt has been replaced by fishing.lua.

fishing.lua example:
Kod:
FishingConfig = {
    general_catch_chance = 100,
    fishes = {
        { vnum = 50002, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 27992, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 27993, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 27994, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 27802, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 27803, dead_vnum = 27833, grill_vnum = 27863, chance = 10 },
        { vnum = 27804, dead_vnum = 27834, grill_vnum = 27864, chance = 10 },
        { vnum = 27805, dead_vnum = 27835, grill_vnum = 27865, chance = 10 },
        { vnum = 27806, dead_vnum = 27836, grill_vnum = 27866, chance = 10 },
        { vnum = 27807, dead_vnum = 27837, grill_vnum = 27867, chance = 10 },
        { vnum = 27808, dead_vnum = 27838, grill_vnum = 27868, chance = 10 },
        { vnum = 27809, dead_vnum = 27839, grill_vnum = 27869, chance = 10 },
        { vnum = 27810, dead_vnum = 27840, grill_vnum = 27870, chance = 10 },
        { vnum = 27811, dead_vnum = 27841, grill_vnum = 27871, chance = 10 },
        { vnum = 27812, dead_vnum = 27842, grill_vnum = 27872, chance = 10 },
        { vnum = 27813, dead_vnum = 27843, grill_vnum = 27873, chance = 10 },
        { vnum = 27814, dead_vnum = 27844, grill_vnum = 27874, chance = 10 },
        { vnum = 27815, dead_vnum = 27845, grill_vnum = 27875, chance = 10 },
        { vnum = 27816, dead_vnum = 27846, grill_vnum = 27876, chance = 10 },
        { vnum = 27817, dead_vnum = 27847, grill_vnum = 27877, chance = 10 },
        { vnum = 27818, dead_vnum = 27848, grill_vnum = 27878, chance = 10 },
        { vnum = 27819, dead_vnum = 27849, grill_vnum = 27879, chance = 10 },
        { vnum = 27820, dead_vnum = 27850, grill_vnum = 27880, chance = 10 },
        { vnum = 27821, dead_vnum = 27851, grill_vnum = 27881, chance = 10 },
        { vnum = 27822, dead_vnum = 27852, grill_vnum = 27882, chance = 10 },
        { vnum = 27823, dead_vnum = 27853, grill_vnum = 27883, chance = 10 },
        { vnum = 70201, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70202, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70203, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70204, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70205, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70206, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70048, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70049, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70050, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 70051, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 80008, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 50009, dead_vnum = 0, grill_vnum = 0, chance = 10 },
        { vnum = 50008, dead_vnum = 0, grill_vnum = 0, chance = 10 },
    }
}

Images:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

• Price: €300
• The price may change over time as the server continues to receive updates. This thread will be updated periodically with new additions or previously omitted information.
• For further information, you can contact me on Discord: choroy
 
Son düzenleme:

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst