[Çözüm] DevIL Kütüphanesini Yeniden Derlemeden Lonca Simgesi (Guild Mark) Sorunu Düzeltmesi

Caelnarae

Üye
Üye
Mesaj
2
Beğeni
3
Puan
40
Ticaret Puanı
0
Bildiğiniz üzere DevIL kütüphanesinin güncel sürümlerini kullandığımızda, oyun içerisinde lonca simgelerinde bozulmalar/sorunlar yaşanıyordu. Bu sorunu aşmak için normalde DevIL'in kaynak kodlarındaki il_targa.cpp dosyasını düzenleyip kütüphaneyi sıfırdan derlemek gerekiyordu.

Artık kütüphaneyi yeniden derlemekle uğraşmanıza gerek yok! Aşağıdaki pratik kod düzenlemeleri sayesinde sorunu doğrudan Client ve Server kaynak kodlarınız üzerinden kolayca çözebilirsiniz.

🛠️ 1. Client Tarafı Düzenlemeleri​


A. Macro Tanımlaması​

client/source/UserInterface/Locale_inc.h dosyasını açın ve uygun bir yere ekleyin:

C++:
Genişlet Daralt Kopyala
#define ENABLE_GUILD_MARK_FIXED

B. GuildMarkUploader.cpp Düzenlemesi​

client/source/UserInterface/GuildMarkUploader.cpp dosyasını açın ve aşağıdaki bloğu aratın:

C++:
Genişlet Daralt Kopyala
ilConvertImage(IL_BGRA, IL_BYTE);
ilCopyPixels(0, 0, 0, SGuildMark::WIDTH, SGuildMark::HEIGHT, 1, IL_BGRA, IL_BYTE, (void*)m_kMark.m_apxBuf);

Değiştirin:

C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_GUILD_MARK_FIXED
    ilConvertImage(IL_BGRA, IL_UNSIGNED_BYTE);
    ilCopyPixels(0, 0, 0, SGuildMark::WIDTH, SGuildMark::HEIGHT, 1, IL_BGRA, IL_UNSIGNED_BYTE, (void*)m_kMark.m_apxBuf);
#else
    ilConvertImage(IL_BGRA, IL_BYTE);
    ilCopyPixels(0, 0, 0, SGuildMark::WIDTH, SGuildMark::HEIGHT, 1, IL_BGRA, IL_BYTE, (void*)m_kMark.m_apxBuf);
#endif

C. MarkImage.cpp Düzenlemesi​

client/source/UserInterface/MarkImage.cpp dosyasını açın ve CGuildMarkImage::Save fonksiyonunu aratın:

C++:
Genişlet Daralt Kopyala
bool CGuildMarkImage::Save(const char* c_szFileName)

Bu fonksiyonun içerisinde şu satırları bulun:

C++:
Genişlet Daralt Kopyala
if (!ilSave(IL_TGA, (const ILstring)c_szFileName))
    return false;

Hemen altına ekleyin:

C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_GUILD_MARK_FIXED
    FILE* fp = fopen(c_szFileName, "r+b");
    if (fp)
    {
        fseek(fp, 17, SEEK_SET);
        fputc(0x00, fp);
        fclose(fp);
    }
#endif

🛠️ 2. Server Tarafı Düzenlemeleri​


A. Service.h Tanımlaması​

server/source/game/src/service.h (veya kullandığınız yapıya göre Common/service.h) dosyasını açın ve ekleyin:

C++:
Genişlet Daralt Kopyala
#define ENABLE_GUILD_MARK_FIXED

B. MarkImage.cpp Düzenlemesi​

server/source/game/src/MarkImage.cpp dosyasını açın ve CGuildMarkImage::Save fonksiyonunu aratın:

C++:
Genişlet Daralt Kopyala
bool CGuildMarkImage::Save(const char* c_szFileName)

Şu satırları bulun:

C++:
Genişlet Daralt Kopyala
if (!ilSave(IL_TGA, (const ILstring)c_szFileName))
    return false;

Hemen altına ekleyin:

C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_GUILD_MARK_FIXED
    FILE* fp = fopen(c_szFileName, "r+b");
    if (fp)
    {
        fseek(fp, 17, SEEK_SET);
        fputc(0x00, fp);
        fclose(fp);
    }
#endif

📌 Neden Bu Çözüm Çalışıyor? (Teknik Detay)​


  • IL_BYTE yerine IL_UNSIGNED_BYTE kullanımı, piksel renk verilerinin işaret hatasına düşmeden doğru aralıkta (0-255) işlenmesini sağlar.
  • fopen ile dosyanın 17. baytına (0x00) yazılan değer ise TGA başlığındaki (header) görüntü yönü / descriptor baytını sıfırlayarak ters dönme veya bozuk taranma sorununu doğrudan dosya üzerinde düzeltir.

Hayırlı olsun, sorunsuz kullanımlar! 🎉
 
Geri
Üst