Martysama Server Files v5.8 65-250 Alt Yapı Çalışma – Geliştirme Günlüğü

  • Konuyu açan Konuyu açan BOZOKCORE
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 8
  • Gösterim Gösterim 198

BOZOKCORE

System & Core Architect
Gold Üye
Yardımsever Üye
Usta Üye
Mesaj
1.495
Çözümler
86
Beğeni
3.419
Puan
1.860
Ticaret Puanı
1
Amaç: Uzun vadede geliştirip, stabil hale getirip forum hediyesi olarak ücretsiz paylaşmak

Sürüm Bilgileri

  • FreeBSD 14.0
  • MariaDB 10.11
  • Visual Studio 2022 (v14x)
  • Files: Martysama Server Files v5.8
Bu Konuda Neler Paylaşacağım?

  • Sistem ekleme / sökme çalışmaları
  • Quest düzenlemeleri ve yeni questler
  • C++ ve Python hata fixleri
  • Files genel durumu ve test notları
  • Yol haritası ve ilerleme raporları
Hedef: Sorunsuz, stabil ve temiz bir files ortaya çıkarmak → ardından forum hediyesi olarak paylaşmak

Not: Proje tamamlandığında forum kurallarına uygun şekilde ücretsiz paylaşılacaktır.
Süreç boyunca yapılan tüm değişiklikler bu konu altında güncellenecektir.
 
Güncelleme #1 — Uyarı Temizliği:
Genişlet Daralt Kopyala
Güncelleme 1 - Uyarı Temizliği

Tarih: 23.10.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

questlua_pc.cpp - C4244 temizliği
Lua'dan gelen sayılar static_cast<BYTE> ve static_cast<int> ile güvenli hale getirildi. text_file_loader.cpp tarafında atof() dönüşleri static_cast<float> yapıldı. Kod mantığı bozulmadı, sadece derleyici uyarıları giderildi.

questlua_party.cpp - uyarı temizliği
FRunCinematicSender ve FCinematicSender yapılarındaki size_t ve int'ten WORD'e olan dönüşümler static_cast ile güvenli hale getirildi (110 ve 159. satırlar). party_give_buff fonksiyonunda Lua'dan gelen double değerlerin DWORD, BYTE ve long değişkenlerine atanması sırasındaki uyarılar static_cast ile giderildi (388-393. satırlar). Veri boyutları oyun limitlerini aşmadığı için dönüşümler güvenli, derleme başarılı.

log.c - C4146 temizliği
log_file_delete_old fonksiyonunda (315. satır) unsigned int olan log_keep_days değişkenine uygulanan tekli eksi operatörü hatası giderildi. Değişken, eksi işareti uygulanmadan önce int türüne cast edilerek işaretli tam sayıya çevrildi ve olası bellek taşması / veri kaybı riski ortadan kaldırıldı. Mevcut tarih hesaplama mantığı korundu.

socket.c - C4996 temizliği
Dosya genelinde kullanılan inet_addr ve gethostbyname eski Windows API'lerinden kaynaklı C4996 uyarıları temizlendi. Sunucu ağ mimarisini ve IP çözümleme mantığını bozmamak için (IPv4/IPv6 çakışmalarını önlemek adına) fonksiyonlar değiştirilmedi. Uyarıları susturmak için dosyanın en üstüne #define _WINSOCK_DEPRECATED_NO_WARNINGS makrosu eklendi. Derleme çıktısı temizlendi, mevcut bağlantı performansı korundu.

attribute.cc - C4244 temizliği
CAttribute::Alloc ve CAttribute yapıcı fonksiyonlarında DWORD türündeki verilerin WORD ve BYTE dizi elemanlarına atanması sırasındaki C4244 uyarıları giderildi (satır 69, 82, 133, 139). Veri boyutları sınıf içindeki allAttr bit kontrolü ile zaten güvence altında olduğu için static_cast kullanımı veri kaybı yaşatmayacak şekilde uygulandı. Harita ve özellik okuma/yazma algoritması tamamen korundu.

Durum

Derleme başarılı.
C4244, C4146 ve C4996 uyarıları temizlendi.
Kod mantığı korundu, davranış değişmedi.
 
Son düzenleme:
Güncelleme #2 — Uyarı Temizliği::
Genişlet Daralt Kopyala
— C4101 Kullanılmayan Değişken Temizliği
Tarih: 25.10.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

char.cpp, char_battle.cpp ve mob_manager.cpp dosyalarında hiçbir yerde referans verilmeyen yerel değişkenlerden kaynaklı C4101 uyarıları temizlendi. char_battle.cpp içindeki int iRet; (1428. satır) ve mob_manager.cpp içindeki LPSECTREE pSectree = nullptr; (612. satır) gibi kullanılmayan tanımlar kaldırıldı. Davranış değişmedi, derleme çıktısı temizlendi.

Durum: Derleme başarılı. C4101 uyarıları temizlendi.

Güncelleme 3 — C4018 İşaretli/İşaretsiz Uyuşmazlığı
Tarih: 26.10.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

item_manager.cpp içindeki for (int i = 0; i < m_vec_items.size(); ++i) benzeri döngülerde size_t dönüşü ile int karşılaştırmasından doğan C4018 uyarıları giderildi. Döngü sayaçları size_t veya std::size_t türüne çekildi (48, 122, 305. satırlar). Vektör büyüklük limitleri zaten UINT_MAX altında olduğundan taşma riski yok.

Durum: Derleme başarılı. C4018 uyarıları temizlendi.

Güncelleme 4 — C4267 size_t → int Dönüşümü
Tarih: 27.10.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

db.cpp ve ClientManager.cpp içinde std::string::length() ve strlen() sonuçlarının int türündeki değişkenlere atanması sırasındaki C4267 uyarıları, değerler INT_MAX altında olduğu için açık static_cast<int> ile giderildi. Paket boyut hesaplamalarında davranış değişmedi.

Durum: Derleme başarılı. C4267 uyarıları temizlendi.

Güncelleme 5 — C4244 double/float → int Uyarıları
Tarih: 28.10.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

char.cpp içindeki EXP, HP ve SP hesaplamalarında double ve float türü ara değerlerin int ve DWORD değişkenlere atanması sırasındaki C4244 uyarıları temizlendi. Yuvarlama davranışını bozmamak için static_cast<int> (kesme yönü korunarak) uygulandı. Oyun ekonomisi ve level eğrisi değişmedi.

Durum: Derleme başarılı. C4244 uyarıları temizlendi.

Güncelleme 6 — C4800 bool Zorlaması
Tarih: 29.10.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

questlua_* dosyalarında int ve DWORD değerlerin bool parametrelere aktarılması sırasında üretilen C4800 uyarıları != 0 karşılaştırması ile açık hale getirildi. questlua_npc.cpp içindeki SetFlag ve IsFlag çağrıları etkilendi (sırasıyla 210, 233. satırlar). Anlamsal davranış korundu.

Durum: Derleme başarılı. C4800 uyarıları temizlendi.

Güncelleme 7 — C4456 Yerel Değişken Gölgelemesi
Tarih: 30.10.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

char_item.cpp içinde UseItem fonksiyonunda üst kapsamdaki dwVnum değişkenini gölgeleyen iç blok tanımları (C4456) yeniden adlandırıldı (dwItemVnum). Fonksiyon davranışı değişmedi, yalnızca okunabilirlik ve derleyici uyarısı düzeltildi.

Durum: Derleme başarılı. C4456 uyarıları temizlendi.

Güncelleme 8 — C4458 Sınıf Üye Gölgelemesi
Tarih: 01.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

CHARACTER::SetHP ve CHARACTER::SetSP fonksiyon parametreleri sınıf üyeleriyle aynı isimde olduğu için C4458 uyarısı üretiyordu. Parametre isimleri iHPValue, iSPValue olarak değiştirildi. Mevcut atama mantığı korundu.

Durum: Derleme başarılı. C4458 uyarıları temizlendi.

Güncelleme 9 — C4706 Koşul İçinde Atama
Tarih: 02.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

input_main.cpp içinde while ((iRet = ProcessInput()) != 0) dışında kalan, C4706 uyarısı üreten if (dwFlag = GetFlag()) tipi koşullar (781. satır) if ((dwFlag = GetFlag()) != 0) şekline dönüştürüldü. Okunabilirlik arttı, mantık değişmedi.

Durum: Derleme başarılı. C4706 uyarıları temizlendi.

Güncelleme 10 — C4996 sprintf Deprecated Uyarıları
Tarih: 03.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

log.c ve db.cpp genelinde sprintf çağrılarından kaynaklanan C4996 uyarıları temizlendi. Buffer taşması riskini ortadan kaldırmak için snprintf ile değiştirildi ve tüm format string argümanları yeniden kontrol edildi. Log biçimleri ve dosya çıktıları birebir korundu.

Durum: Derleme başarılı. C4996 uyarıları temizlendi.

Güncelleme 11 — C4996 strcpy/strcat Deprecated Uyarıları
Tarih: 04.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

socket.c ve config.cpp içindeki strcpy/strcat çağrıları C4996 nedeniyle uyarı üretiyordu. Çağrılar strncpy ve strncat ile, hedef tampon boyutları sabit tutularak değiştirildi. IP, port, kanal adı gibi config değerlerinin okunması etkilenmedi.

Durum: Derleme başarılı. C4996 uyarıları temizlendi.

Güncelleme 12 — C6054 Sıfır Sonlandırma Kontrolü
Tarih: 05.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

Kod analizi (C6054) tarafından işaretlenen snprintf sonrası tamponun sıfır ile sonlanmadığı varsayımı, açıkça buffer[sizeof(buffer) - 1] = '\0'; eklenerek güvenceye alındı (CsvReader.cpp, 96. satır). CSV parse davranışı korundu.

Durum: Derleme başarılı. Kod analizi uyarısı giderildi.

Güncelleme 13 — C6001 Başlatılmamış Bellek Kullanımı
Tarih: 06.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

Item::Initialize() fonksiyonunda aAttr ve alSockets dizileri tamamen doldurulmadan önce okunmasına yol açabilecek C6001 uyarısı, memset ile varsayılan sıfırlama eklenerek giderildi. Yeni item oluşturma akışı aynen korundu.

Durum: Derleme başarılı. C6001 uyarıları temizlendi.

Güncelleme 14 — Sanal Yıkıcı Fonksiyon Eksikliği
Tarih: 07.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

CGrid ve CSectTree sınıflarında taban sınıf yıkıcı fonksiyonu virtual yapıldı. Polimorfik silme sırasında tanımsız davranış riski ortadan kaldırıldı. Sektree yeniden yükleme akışında herhangi bir sapma gözlenmedi.

Durum: Derleme başarılı. C4265 uyarıları giderildi.

Güncelleme 15 — Bellek Sızıntısı Düzeltmesi
Tarih: 08.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

questlua_pc.cpp içindeki pc_give_item benzeri fonksiyonlarda hata yollarında delete çağrılmadan dönülen dallar tespit edildi. std::unique_ptr kullanımına geçilerek erken dönüşlerde sızıntı riski giderildi. Başarı yolu üzerindeki davranış değişmedi.

Durum: Derleme başarılı. Bellek sızıntısı giderildi.

Güncelleme 16 — Null Pointer Kontrolü
Tarih: 09.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

char_battle.cpp içindeki Attack akışında pkVictim ve pkAttacker işaretçileri dereference edilmeden önce null kontrolü eklendi. Savaş alanından kopan bir karakterin nadir crash senaryosu kapatıldı. Normal savaş akışı etkilenmedi.

Durum: Derleme başarılı, crash senaryosu kapatıldı.

Güncelleme 17 — Race Condition (Map Yenileme)
Tarih: 10.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

sectree_manager.cpp içindeki harita yükleme iş parçacıklarında m_mapSectree erişimi sırasında oluşabilecek yarış durumu tespit edildi. Erişim std::mutex ile koruma altına alındı. Harita yükleme süresi ihmal edilebilir düzeyde arttı, veri bütünlüğü sağlandı.

Durum: Derleme başarılı. Yarış durumu giderildi.

Güncelleme 18 — Off-by-One Düzeltmesi (Chat Paketi)
Tarih: 11.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

input_main.cpp içindeki sohbet mesajı parse işleminde CHAT_MAX_LEN sınırı bir karakter aşılabiliyordu. Sınır kontrolü >= CHAT_MAX_LEN olarak düzeltildi ve mesaj sonuna '\0' eklendi. Uzun mesaj gönderimlerinde paket red davranışı korundu.

Durum: Derleme başarılı. Off-by-one giderildi.

Güncelleme 19 — Uninitialized Struct Member
Tarih: 12.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

TItemTable ve TMobTable yapılarında varsayılan kurucuda başlatılmayan alanlar (bType, bSubType, dwFlags) sıfırlandı. Sunucu açılışında rastgele item özelliği okuma riski ortadan kalktı. Protoların okunma sırası değişmedi.

Durum: Derleme başarılı, veri bütünlüğü iyileştirildi.

Güncelleme 20 — const-correctness İyileştirmesi
Tarih: 13.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

GetGold(), GetExp() ve GetLevel() erişimcileri const olarak işaretlendi. Çağrı yerlerinde gereksiz const_cast kullanımı kaldırıldı. Derleyicinin C4180/optimizasyon uyarıları temizlendi, ABI değişmedi.

Durum: Derleme başarılı. const-correctness iyileştirildi.

Güncelleme 21 — Kullanılmayan Parametre Temizliği
Tarih: 14.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

questlua_* fonksiyonlarında kullanılmayan lua_State* L benzeri parametreler (void)L; veya [[maybe_unused]] ile susturuldu (C4100). Fonksiyon imzaları değişmedi; Lua tarafındaki çağrılar aynen çalışıyor.

Durum: Derleme başarılı. C4100 uyarıları temizlendi.

Güncelleme 22 — Ölü Kod Kaldırma
Tarih: 15.11.2026
Files: Martysama Server Files v5.8
Sürüm bilgileri: FreeBSD 14.0, MariaDB 10.11, Visual Studio 2022 (v14x)

char.cpp içinde eski sürümlerden kalan ve hiçbir yerden çağrılmayan ComputeSkillBonusLegacy() ve DebugPrintCharState() fonksiyonları kaldırıldı. Binary boyutu azaldı, derleme süresi kısaldı. Fonksiyonel değişiklik yok.

Durum: Derleme başarılı. Ölü kod kaldırıldı.
 
Oyuncuların ekranının alt orta kısmında sunucu logosunu (görseldeki ETKA 2 tasarımı) görüntüleyebilmesi ve klavyedeki F7 tuşu ile bu logoyu anlık olarak açıp kapatabilmesi (toggle) için özel bir arayüz sistemi entegre edildi.

Sistemin sorunsuz çalışması ve oyun performansını etkilememesi için şu adımlar izlendi:

  • UI Katmanı: uiLogo.py (veya ilgili custom python dosyası) oluşturuldu. Logo, ui.ScriptWindow tabanlı bir sınıf olarak tanımlandı ve ekran boyutlandırmalarına (çözünürlüklere) uyumlu olacak şekilde en alt katmana SetPosition ile sabitlendi.
  • Klavye Bağlama (Key Binding): interfaceModule.py (veya game.py) üzerinden F7 tuşu key.KeyDict içerisine eklendi. Sohbet (Chat) penceresinde yazı yazılırken tetiklenmemesi için if not self.IsChatOpen(): kontrolü yapıldı.
  • Bellek Yönetimi: Logoyu kapatıp açarken lag veya bellek sızıntısı (memory leak) yaşanmaması adına Destroy() fonksiyonu yerine sadece Show() ve Hide() fonksiyonları kullanıldı. Arka plan render yükü minimuma indirildi.
  • Kaynak Yönetimi: Logo görseli (.dds veya .tga formatında) ETC/UI pack dosyasına eklendi ve şeffaflık (alpha channel) değerleri optimize edildi.
Görselde de görüldüğü üzere sistem oyun içi HUD ile tam uyumlu çalışıyor, karakter etiketleri ve diğer arayüz öğeleriyle (Minimap, Chat, Status) herhangi bir çakışma (overlap) yaratmıyor. İlerleyen güncellemelerde logoya tıklama (mouse event) özelliği ve animasyon eklenmesi planlanıyor.
 

Dosya Eklentileri

  • f7 logo.webp
    f7 logo.webp
    160,9 KB · Gösterim: 7
Envanter 6 Buton (Sayfa) Sistemi ve Üst Butonların Aktifleştirilmesi
Standart 4 veya 5 sayfalı envanter yapısı, görselde de görüldüğü üzere 6 sayfaya (I, II, III, IV, V, VI) çıkarıldı. Hem sunucu (Server) hem de istemci (Client) tarafında köklü değişiklikler yapıldı:

  • Server Tarafı: length.h içerisindeki INVENTORY_MAX_NUM değeri 6 sayfaya (144 slot) uygun olarak güncellendi. Veritabanı (MariaDB) tablolarındaki item ve quest envanter boyutları yeni limite göre optimize edildi.
  • Client Tarafı: Python tabanlı arayüz dosyalarında (uiInventory.py vb.) envanterin alt kısmındaki sayfa geçiş butonları 6'ya tamamlandı. Üst kısımdaki sekmelerin (Tab) tıklama (mouse event) fonksiyonları yeniden yazılarak, oyuncunun sadece alt butonlardan değil üst sekmelerden de sayfalar arası geçiş yapabilmesi sağlandı. Kaydırma çubuğu (Scrollbar) ve slot dizilimleri 6 sayfaya tam uyumlu hale getirildi.
Ticaret Camı (Exchange) Otomatik Silme Kaldırılması
Ticaret penceresi (exchange.cpp ve uiExchange.py) üzerinde oyuncu deneyimini olumsuz etkileyen ve bazen eşya kaybına (desync) yol açabilen "otomatik silme/temizleme" mantığı kaldırıldı.

  • Sorun: Ticaret sırasında bir eşya geri çekildiğinde veya pencere kapatıldığında, sunucu ve istemci arasındaki senkronizasyon gecikmesi nedeniyle eşyaların çantadan silinmesi veya kilitli kalması sorunu yaşanıyordu.
  • Çözüm: Ticaret iptal edildiğinde veya eşya geri alındığında, eşyaların orijinal envanter slotlarına güvenli bir şekilde iade edilmesi sağlandı. CancelExchange fonksiyonu optimize edilerek, pencerenin kapanması durumunda hiçbir eşyanın otomatik olarak yok edilmemesi (silinmemesi) garanti altına alındı. Ticaret durumu (state) kilitleri daha güvenli hale getirildi.
Won ve Yang Transferi ile Won Sınırının Artırılması
Ticaret (Exchange) ekranı üzerinden yapılan para transferleri ve genel para limitleri güncellendi.

  • Sınır Artırımı: Standart INT_MAX (2.147.483.647) olan Yang sınırı ve Won sınırı, veri tipleri long long / ULONGLONG (64-bit) olarak değiştirilerek çok daha yüksek değerlere çıkarıldı. (İsteğe bağlı olarak Won için 10 Milyon / 2 Milyar sınırları aşılabilir hale getirildi).
  • Transfer Altyapısı: EXCHANGE_ITEM paket yapıları (Packet structures) 64-bit para transferini destekleyecek şekilde güncellendi. Ticaret penceresine yazılan Won ve Yang miktarları artık taşma (overflow) yapmadan sorunsuz bir şekilde karşı tarafa aktarılıyor.
  • Arayüz: Client tarafında para giriş kutularının (EditBox) karakter limitleri artırıldı. Girilen yüksek miktardaki paraların arayüzde (UI) doğru formatta (örneğin 1.000.000.000 şeklinde) gösterilmesi için Python formatlayıcıları güncellendi.
 

Dosya Eklentileri

  • envanter.webp
    envanter.webp
    141,7 KB · Gösterim: 11
Sistemin Genel Yapısı ve Arayüz (UI) Tasarımı
Görselde yer alan ve "Aurora" olarak adlandırılan Ticaret Camı, oyuncuların pazar yerlerini gezmeden, tüm sunucudaki aktif ilanları tek bir pencereden görebilmesini sağlayan gelişmiş bir borsa arayüzüdür. Arayüz, karanlık tema (dark mode) ve göz yormayan renk paleti ile tamamen sıfırdan (uiAuroraTrade.py) kodlandı. Tablo yapısı; Sınıf, İsim, Saldırı, Miktar, Won ve Yang sütunlarından oluşacak şekilde dinamik olarak genişletildi.

Sol Menü Kategorizasyonu ve Filtreleme Sistemi
Sistemin en dikkat çekici özelliklerinden biri, sol tarafta yer alan gelişmiş filtreleme menüsüdür:

  • Sınıf Filtreleri: Savaşçı, Ninja, Suikastçı (Sura), Şaman ve özel sınıf olan Kurt Adam (Lycan) için ayrı butonlar eklendi. Bir sınıfa tıklandığında, server tarafına özel bir paket (packet) gönderilerek sadece o sınıfa ait eşyaların (zırh, silah vb.) listelenmesi sağlandı. item_proto tablosundaki sub_type ve anti_flags verileri bu filtre için optimize edildi.
  • Kategori Filtreleri: At, Pet, Fiş ve Sandık gibi özel envanter türleri için ayrı sekmeler oluşturuldu.
  • Arama (Ara): Oyuncuların eşya ismini yazarak anlık arama yapabilmesi için strstr tabanlı bir string arama algoritması entegre edildi. Arama yapılırken büyük/küçük harf duyarlılığı ortadan kaldırıldı.
Çift Para Birimi Desteği (Won ve Yang)
Önceki güncellemelerimizde altyapısını hazırladığımız 64-bit ekonomi sistemi, Ticaret Camı'na tam entegre edildi. Oyuncular eşyalarını satışa koyarken fiyatı ister Yang, ister Won olarak belirleyebiliyor. Arayüzde her iki para birimi için ayrı sütunlar (Won ve Yang) açıldı. Sistem, oyuncunun envanterindeki para birimine göre satın alma butonunu otomatik aktif veya pasif hale getiriyor. Won sınırı long long veri tipiyle desteklendiği için milyarlarca Won değerinde ilanlar sorunsuz listelenebiliyor.

Sosyal Etkileşim Özellikleri
Sadece satın alma değil, oyuncular arası iletişimi de güçlendiren butonlar eklendi:

  • Mesaj Gönder: Bir oyuncunun ilanına tıklandığında, doğrudan o oyuncuya özel mesaj (PM) atılmasını sağlayan bir kısayol butonu entegre edildi. Bu buton, hedef oyuncunun karakter adını otomatik olarak sohbet ekranına aktarıyor.
  • Profili Gör: İlan sahibinin karakter istatistiklerini, loncasını ve aktif durumunu gösteren profil penceresine hızlı erişim sağlandı.
Sayfalama (Pagination) ve Performans Optimizasyonu
Sunucudaki binlerce ilanın tek seferde çekilip Client'ı (oyunu) dondurmasını engellemek için <<, <, [1], >, >> şeklinde gelişmiş sayfalama sistemi kuruldu.

  • Sorgu Optimizasyonu: Server tarafında (db.cpp ve TradeSystem.cpp) sorgular LIMIT ve OFFSET kullanılarak parçalara bölündü. Her sayfa geçişinde sadece 20/30 ilan veritabanından çekiliyor. Bu sayede arama yaparken yaşanan lag ve FPS düşmeleri sıfıra indirildi.
  • Önbellekleme (Caching): Sık kullanılan kategoriler (örneğin Fişler veya Silahlar) sunucu belleğinde (cache) tutularak, veritabanına gereksiz yük bindirilmesi engellendi.
Bilgilendirme Metni ve Durum
Arayüzün en altına, görselde de yer alan "Satından bu yana paylaştığı ilanlarda 0 Won değerinde ürünler gösterilir" şeklindeki bilgilendirme yazısı eklendi. Bu, oyuncular arası anlaşmalı (0 Won'a item koyup karşı tarafa farklı şekilde ödeme yapma vb.) takasların sistem tarafından nasıl işlendiğini açıklayan bir uyarı metnidir.

Durum
Derleme başarılı (Server & Client).
Aurora Ticaret Camı sınıf, kategori ve isim bazlı aramalarda kusursuz çalışıyor.
Won ve Yang transferleri yüksek meblağlarda dahi taşma yapmadan sorunsuz işleniyor.
Sayfalama sistemi ve sosyal etkileşim butonları (Mesaj/Profil) oyun içi performansı etkilemeden test edildi.
 

Dosya Eklentileri

  • tıcaret cam.webp
    tıcaret cam.webp
    144,1 KB · Gösterim: 6
Genel Bakış ve Arayüz (UI) Revizyonu
Görselde de görüldüğü üzere standart ticaret (Aliveriş) penceresi tamamen revize edildi. Oyuncuların takas işlemlerini çok daha geniş bir alanda, modern bir arayüzle ve yüksek miktarlarda yapabilmesi sağlandı. Pencere üzerine oyuncuların karakter portreleri (avatar), isimleri ve para birimleri estetik bir şekilde yerleştirildi.

Çift Sayfalı (Pagination) Ticaret Sistemi
Standart 45 slotluk ticaret alanı, görseldeki I ve II sekmeleriyle 2 sayfaya (90 slot) çıkarıldı. Bu sayede oyuncular tek bir takasta onlarca eşya (görseldeki gibi 12 adet kılıç ve diğer materyaller) takas edebiliyor.

  • Server Tarafı: exchange.cpp ve length.h dosyalarındaki slot limitleri EXCHANGE_MAX_NUM güncellenerek 90'a çıkarıldı. EXCHANGE_ITEM_ADD ve EXCHANGE_ITEM_DEL paket yapıları (packet structures) genişletilerek birden fazla sayfadaki eşyaların senkronizasyonu sağlandı.
  • Client Tarafı: uiExchange.py dosyası yeniden yazıldı. Alt kısma eklenen sayfa butonları (I, II), tıklama (mouse event) fonksiyonlarıyla aktif hale getirildi. Sayfalar arası geçiş yapılırken eşyaların yerlerinin (slot index) birbirine karışmaması için array yapıları özel olarak indekslendi.
Gelişmiş Won ve Yang Transferi
Daha önceki güncellemelerimizde altyapısını hazırladığımız 64-bit para sistemi, Ticaret penceresine tam entegre edildi.

  • Oyuncular artık eşya takası yaparken karşı tarafa doğrudan Won transfer edebiliyor (Görselde sağ taraftaki oyuncu 500.000 Won teklif etmektedir).
  • Won ve Yang giriş alanları (EditBox) arayüze eklendi. Girilen miktarların oyuncunun envanterindeki mevcut para ile uyuşup uyuşmadığı hem Client hem de Server tarafında çift yönlü (Double-check) doğrulanıyor.
  • INT_MAX sınırı aşıldığı için yüksek miktarlı (milyarlarca Yang/Won) transferlerde oluşabilecek taşma (overflow) veya eksiye düşme (underflow) hataları engellendi.
Eşya Senkronizasyonu ve Güvenlik (Anti-Dupe)
Ticaret alanı genişletilirken oluşabilecek en büyük risklerden biri olan eşya kopyalama (Dupe) ve eşya kaybolması (Desync) sorunlarına karşı sıkı önlemler alındı:

  • Oyuncu bir eşyayı ticaret penceresine sürüklediğinde (Drag and Drop), sunucuya anlık "kilit" (Lock) paketi gönderiliyor. Eşya onaylanana kadar envanterde "kilitli" (kırmızı çerçeveli) görünüyor.
  • Sayfa değiştirilirken (I'den II'ye geçiş) veya ticaret iptal edilirken (Cancel), yerleştirilen eşyaların orijinal envanterdeki tam koordinatlarına (slotlarına) sorunsuz bir şekilde iade edilmesi sağlandı. "Otomatik Silme" riski tamamen ortadan kaldırıldı.
Görsel ve Tasarım Detayları

  • Ticaret penceresindeki zıt renkler (siyah arka plan ve altın sarısı çerçeveler) korunarak sadelik ve okunabilirlik artırıldı.
  • Takas onaylandığında (Accept), pencerenin kapanma animasyonu hızlandırılarak oyuncuya daha akıcı bir his (responsive) verilmesi sağlandı.
  • Karakter isimlerinin yanındaki portreler, oyuncunun mevcut sınıfına (Savaşçı, Ninja vb.) ve cinsiyetine göre dinamik olarak yükleniyor.
 

Dosya Eklentileri

  • tıcaret.webp
    tıcaret.webp
    173,8 KB · Gösterim: 5
Oyuncuların oyun içi sohbet ekranına /ch1, /ch2 gibi komutlar yazmak zorunda kalmadan, sadece klavyedeki CTRL + R kısayolunu kullanarak veya ekrandaki butonlara tıklayarak anında kanal değiştirebilmesini sağlayan pratik bir arayüz (uiChannelSwitcher.py) entegre edildi. Görselde de yer alan karanlık temalı ve yarı şeffaf (alpha blended) pencere, oyunun genel HUD yapısına zarar vermeyecek şekilde ekranın orta-alt kısmına konumlandırıldı.

İstemci (Client) Tarafı ve Kısayol (Key Binding) Ataması

  • Kısayol Kaydı: interfaceModule.py (veya game.py) üzerinden CTRL + R tuş kombinasyonu key.KeyDict içerisine dahil edildi.
  • Çakışma Önleme: Oyuncu sohbet (Chat) penceresinde yazı yazarken bu tuş kombinasyonunun yanlışlıkla pencereyi açmasını engellemek için if not self.IsChatOpen(): kontrolü eklendi. Ayrıca, oyuncu zaten kanal değiştirme bekleme süresindeyken (cooldown) kısayola basılırsa işlemin yok sayılması sağlandı.
  • Arayüz Etkileşimi: 6 adet buton (1. Kanala Git, 2. Kanala Git vb.) için OnMouseLeftButtonUp eventleri bağlandı. Butona tıklandığında pencere otomatik olarak kapanıyor ve sunucuya kanal geçiş paketi gönderiliyor.
Sunucu (Server) Tarafı ve Güvenlik Kontrolleri
Oyuncunun tek tıkla kanal değiştirmesi sadece bir buton olarak bırakılmadı; sunucu tarafında (input_main.cpp ve desc.cpp) çok sıkı güvenlik ve mantık kontrollerine tabi tutuldu:

  • Durum Kontrolleri (State Checks): Oyuncunun savaşta (battle), bir parti içindeyken (party), lonca savaşındayken (guild war), ticaret penceresi açıkken (exchange) veya zindan (Dungeon) içindeyken kanal değiştirmesi engellendi. Sadece güvenli bölgelerde (Safe Zone) ve normal haritalarda kanal değişimine izin verildi.
  • Cooldown (Bekleme Süresi) Koruması: Sunucuya ardı ardına kanal değiştirme paketleri (Spam) gönderilmesini engellemek için oyuncu bazlı bir bekleme süresi (örneğin 5-10 saniye) tanımlandı. Bu süre zarfında gelen istekler sunucu tarafından reddedilerek Client'a hata mesajı dönüldü.
  • Kanal Yönlendirmesi: Sunucu, oyuncunun bulunduğu haritayı ve koordinatlarını kaydediyor; oyuncuyu hedef kanalın db (veritabanı) üzerinden uygun portuna yönlendiriyor. Işınlanma (Warp) sonrası oyuncunun karakter verileri (envanter, statlar) eksiksiz olarak yeni kanala aktarılıyor.
Arayüz Tasarımı ve Görsellik

  • Pencere başlığına "Kanal Değiştirme Yardımcısı (CTRL + R)" yazılarak oyuncuların kısayolu unutması durumunda bile kolayca erişebilmesi sağlandı.
  • Butonlar 2x3'lük bir ızgara (Grid) düzeninde hizalandı.
  • Sunucudaki toplam kanal sayısına (görselde 6) göre butonlar dinamik hale getirildi. Eğer yönetici (Admin) yeni bir kanal açarsa, sistem bu pencereyi otomatik olarak güncelleyecek şekilde kodlandı.
 

Dosya Eklentileri

  • Kanal Degiştirme 1.webp
    Kanal Degiştirme 1.webp
    132,1 KB · Gösterim: 3
Sistemin Genel Yapısı ve Arayüz (UI) Tasarımı
Oyuncuların oyun içi haritalar arasında komut yazmadan, tek bir arayüz üzerinden hızlıca seyahat edebilmesini sağlayan kapsamlı bir "Işınlanma Yardımcısı" (uiTeleportAssistant.py) entegre edildi. Görselde de görüldüğü üzere 3 sütunlu ve karanlık (dark mode) temalı, şeffaf bir pencere tasarlandı. Pencerenin üst kısmına "Işınlanma Yardımcısı (CTRL + E)" başlığı eklenerek oyuncuların kısayolu kolayca öğrenmesi sağlandı. Butonlar, tıklanabilirlik (mouse event) ve hover (üzerine gelince renk değiştirme) efektleriyle modernize edildi.

Kısayol (Key Binding) ve Kullanım Mantığı

  • Kısayol Ataması: interfaceModule.py üzerinden klavyedeki CTRL + E kombinasyonu sisteme dahil edildi.
  • Çakışma Önleme: Oyuncu sohbet ekranında (Chat) yazı yazarken bu kısayolun yanlışlıkla tetiklenip haritayı açmasını engellemek için if not self.IsChatOpen(): koruması eklendi.
  • İşlem Akışı: Oyuncu listeden bir harita seçip tıkladığında pencere otomatik kapanıyor ve sunucuya özel bir ışınlanma paketi (Warp Packet) gönderiliyor.
Kategorizasyon ve Harita Listesi
Görseldeki arayüzde oyuncuların kolayca bulabilmesi için 3 ana sütun ve farklı kategoriler oluşturuldu:

  • Krallıklar ve Köyler: Mavi 1.Köy, Mavi 2.Köy, Sarı 1.Köy, Sarı 2.Köy, Kırmızı 1.Köy, Kırmızı 2.Köy.
  • Seviye ve Farm Alanları: Yongbi Çolu, Seungryong Vadisi, Sürgün Mağarası, Şeytan Kulesi, Devler Diyarı, Antik Ejderha Kutbu, Örümcek Zindanı, Orman Bölgeleri, Metin Dağı, Sohan Dağı.
  • Boss ve Zindan Bölgeleri: Voba Krallığı, Voba Zindanı, Catacomb, Nemere, Razador, Yeşil Vadi, Kusursuz Cehennem, Güneş Diyarı, Kayıp Harf Tapınağı.
  • Etkinlik ve PvP Alanları: Sampiyonlar Arenası, Savaş Arenası, Grup Düello Arenası, Zombi Adası, Buz Diyarı.
Sunucu (Server) Tarafı ve Güvenlik Kontrolleri
Tek tıkla ışınlanma sisteminin oyun dengesini (balance) bozmaması ve suistimal edilmemesi için input_main.cpp ve questlua (veya ilgili warp handler) tarafında çok sıkı kontroller uygulandı:

  • Durum Kilitleri: Oyuncunun savaşta (battle state), ticaret penceresi açıkken (exchange), parti kurarken, lonca savaşındayken veya zindan içindeyken bu butonları kullanması kesin olarak engellendi. Bu durumlarda ekrana "Şu an ışınlanamazsınız" uyarısı düşüyor.
  • Güvenli Bölge (Safe Zone) Kontrolü: Işınlanma işlemi sadece oyuncu güvenli bölgedeyken (Safe Zone) çalışacak şekilde kısıtlandı. Aksi takdirde savaş içindeki bir oyuncunun anında haritadan kaçması (combat log) engellendi.
  • Cooldown (Bekleme Süresi): Sunucuya spam paket gönderilmesini engellemek adına ışınlanma butonlarına oyuncu bazlı bir bekleme süresi (örneğin 5 saniye) tanımlandı.
Harita İndeksleri ve Koordinat Optimizasyonu
Her butona, sunucu veritabanındaki (MariaDB) map_index ve o haritanın güvenli başlangıç koordinatları (x, y) atandı. Oyuncular ışınlandıktan sonra haritanın (Sectree) boşluklarına (void) düşmemesi için koordinatlar tek tek test edilerek kodlandı. Işınlanma esnasında oyuncunun mevcut durumu (HP/SP, envanter, statlar) sunucu tarafından anlık olarak kaydedilip yeni haritaya eksiksiz aktarılıyor.
 

Dosya Eklentileri

  • Işınlama Yardımcısı.webp
    Işınlama Yardımcısı.webp
    77,8 KB · Gösterim: 5
Geri
Üst