Çözüldü metin2 client dosyaları ve pack dosyaları arasındaki ilişki

Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

unclebobjr

Yeni Üye
Üye
Mesaj
5
Beğeni
2
Puan
3
Merhabalar, Client dosyaları ve pack dosyaları arasındaki bağlılığı anlayamadım. Örneğin elimizde bir client solutionu var bunun üzerinde yaptığımız değişikleri .exe çıktısı alarak pack dosyaları içine atıyoruz. Ama aralarında nasıl bir bağlılık oluyor.

Birde client solutionu ile pack dosyaları çoğu zaman beraber sunulmuyor. Aralarında bir uyumluluk olması gerek mi? Yani kısacası pack dosyaları ve client solutionu içindeki kodların arasındaki ilişkiyi anlayamadım.
 
Çözüm
.exe dosyasının genel olarak çalışma prensibi AppPath/pack dizini olarak belirlidir. Yani exe ye tıkladığında bu dosya şu mantıkla çalışıyor;

=> bulunduğum klasörde pack klasörünü ara,
=> içine gir,
=> içindeki lazım olanları al ve çalıştır,
=> eğer lazım olanlar yoksa veya bir hata varsa çalışmayı durdur.


Client source tarafında Eterpack/Eterpack.cpp dosyasında da .eix .epk araması yapan satırlar şu şekildedir;

C++:
    strncpy(m_indexFileName, dbname, MAX_PATH);
    strcat(m_indexFileName, ".eix");

    m_stDataFileName = dbname;
    m_stDataFileName += ".epk";

.eix ve .epk dosyalarını(uzantı şartına göre) buradan arayıp çalıştırıyor mesela. Buradaki ".eix" ve ".epk" kısımlarını rastgele değiştirip build...
.exe dosyasının genel olarak çalışma prensibi AppPath/pack dizini olarak belirlidir. Yani exe ye tıkladığında bu dosya şu mantıkla çalışıyor;

=> bulunduğum klasörde pack klasörünü ara,
=> içine gir,
=> içindeki lazım olanları al ve çalıştır,
=> eğer lazım olanlar yoksa veya bir hata varsa çalışmayı durdur.


Client source tarafında Eterpack/Eterpack.cpp dosyasında da .eix .epk araması yapan satırlar şu şekildedir;

C++:
    strncpy(m_indexFileName, dbname, MAX_PATH);
    strcat(m_indexFileName, ".eix");

    m_stDataFileName = dbname;
    m_stDataFileName += ".epk";

.eix ve .epk dosyalarını(uzantı şartına göre) buradan arayıp çalıştırıyor mesela. Buradaki ".eix" ve ".epk" kısımlarını rastgele değiştirip build yaptığınızda, yeni oluşturduğunuz .exe dosyası pack klasöründeki hiç bir .eix ve .epk dosyasını görmeyecektir ve doğal olarak çalışmayacaktır. Çalışabilmesi için pack dosyalarının da uzantısını ayı şekilde değiştirmeniz gerekir.

Peki bu .eix ve .epk bulmak için nasıl bir arama yapıyor? diyecek olursanız onun da cevabı UserInterface/UserInterface.cpp dosyasında;

C++:
bool PackInitialize(const char * c_pszFolder)
{
#if defined(ENABLE_FOX_FS) || defined(USE_ZFS)
    NANOBEGIN
    if (_access(c_pszFolder, 0) != 0)
        return true;

    std::string stFolder(c_pszFolder);
    stFolder += "/";

    CTextFileLoader::SetCacheMode();

#if defined(USE_RELATIVE_PATH)
    CEterPackManager::Instance().SetRelativePathMode();
#endif

    CEterPackManager::Instance().SetCacheMode();
    CEterPackManager::Instance().SetSearchMode(CEterPackManager::SEARCH_PACK);

    CSoundData::SetPackMode();
    CEterPackManager::Instance().RegisterPack("pack/maps", "*");
    CEterPackManager::Instance().RegisterPack("pack/update1", "d:/ymir work/");
    CEterPackManager::Instance().RegisterPack("pack/bgm", "bgm");
    CEterPackManager::Instance().RegisterPack("pack/effect", "d:/ymir work/effect");
    CEterPackManager::Instance().RegisterPack("pack/etc", "d:/ymir work");
    CEterPackManager::Instance().RegisterPack("pack/guild", "d:/ymir work/guild");
    CEterPackManager::Instance().RegisterPack("pack/icon", "icon");
    CEterPackManager::Instance().RegisterPack("pack/item", "d:/ymir work/item");
    CEterPackManager::Instance().RegisterPack("pack/locale", "locale");
    CEterPackManager::Instance().RegisterPack("pack/monster", "d:/ymir work/monster");
    CEterPackManager::Instance().RegisterPack("pack/monster2", "d:/ymir work/monster2");
    CEterPackManager::Instance().RegisterPack("pack/npc", "d:/ymir work/npc");
    CEterPackManager::Instance().RegisterPack("pack/npc2", "d:/ymir work/npc2");
    CEterPackManager::Instance().RegisterPack("pack/pc", "d:/ymir work/pc");
    CEterPackManager::Instance().RegisterPack("pack/pc2", "d:/ymir work/pc2");
    CEterPackManager::Instance().RegisterPack("pack/pc3", "d:/ymir work/pc3");
    CEterPackManager::Instance().RegisterPack("pack/property", "property");
    CEterPackManager::Instance().RegisterPack("pack/sound", "sound");
    CEterPackManager::Instance().RegisterPack("pack/terrain", "d:/ymir work/terrainmaps");
    CEterPackManager::Instance().RegisterPack("pack/textureset", "textureset");
    CEterPackManager::Instance().RegisterPack("pack/tree", "d:/ymir work/tree");
    CEterPackManager::Instance().RegisterPack("pack/zone", "d:/ymir work/zone");
    CEterPackManager::Instance().RegisterPack("pack/npc_pet", "d:/ymir work/npc_pet");
    CEterPackManager::Instance().RegisterPack("pack/npc_mount", "d:/ymir work/npc_mount");

    CEterPackManager::Instance().RegisterRootPack((stFolder + std::string("root")).c_str());


Source kısmı paylaşılmayan fileslerde ise, en son oluşturulan .exe zaten pack tarafına uyumlu bir şekilde derlendiği için doğal olarak bütün pack dosyalarını tanıyor. Ancak böyle bir durumda sadece pack dosyaları üzerinden değişiklik yapabilirsiniz. Yaptığınız değişiklikler kod hatası olmadığı sürece yine de .exe tarafından okunup çalıştırılacaktır. Fakat source olmadığı için bundan öteye gidilemez.
 
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst