- Mesaj
- 4.070
- Çözümler
- 408
- Beğeni
- 4.312
- Puan
- 1.849
- Ticaret Puanı
- 0
Merhaba, zaman zaman böyle bir olayın varlığını duyuyordum. Aklıma böyle bir çözüm üretmek geldi. Yaptığım testlerde şimdiye kadar herhangi bir sorun yaşamadım.
Olaydan kısaca bahsetmek gerekirse; oyun açıkken bazı pack dosyaları açılıp düzenlenebiliyor. Bu durum bazı istisnai durumlarda sorun teşkil edebilir.
Çoğu zaman cache sebebiyle yapılan değişiklikler client resetlenmediği sürece oyuna yansımayabiliyor fakat yinede bu durumu engellemenin zararı olmaz diye düşündüm.
Ek olarak; günümüzde zaten foxfs vb. yöntemler kullanılmaktadır, dolayısıyla bunu oyununuz için ek güvenlik olarak da düşünebilirsiniz.
Kodlar tamamen geliştirmeye ve özelleştirmeye açık bir yapıdadır, istediğiniz doğrultuda ilerletebilirsiniz.
Bu yöntemin autopatcher ile beraber daha sağlıklı çalışacağını belirtmeliyim. Yani burada sizlere de iş düşüyor, benim burada paylaştığım kodlar bu sistemin ilk aşamasıdır. Bu kodlara bağlı olarak autopatcherda yapacağınız gerekli düzenlemeler ise ikinci aşama olacak.
Çalışma mantığından örnek vermek gerekirse; x adlı pack dosyası düzenlendiği anda oyun tamamen kapanacak, ve tekrar açılırken autopatcher(dosya bütünlüğü özelliği vb. mevcutsa) bu düzenlenmiş pack dosyanın yerine orjinalini indirecek ve orjinal dosyadan giriş yapılmasını sağlayacak.
Tekrar aynı şekilde pack dosyalarına müdahele söz konusu olursa bu işlemler otomatik tekrarlanacak. (Bu benim önerdiğim fikirdir, isteyenler istediği şekilde kullanabilir.)
Şimdi konuya geçelim..
Düzenlemeden önceki halini gösteren kısa bir video:
EterPack/EterPackManager.h açın ve #include listesine ekleyin:
Şu fonksiyonu bulun:
Altına ekleyin:
EterPackManager.cpp açın ve #include listesine ekleyin:
Şu kısmı bulun ( CEterPackManager::RegisterPack fonksiyonu içinde) :
m_PackMap.insert satırının altına ekleyin:
Daha sonra RegisterPack fonksiyonunun altına ekleyin:
Son olarak UserInterface/PythonApplication.cpp içinde şu kısmı bulun:
Parantezin altına ekleyin:
Düzenleme sonrasını gösteren video ise aşağıdadır:
Meraklısına; Kodlar client açılırken sadece bir defa çalışır ve oyun(client) açık olduğu sürece sadece pack dosyalarının takibini yapar. Yani ışınlanma,karakter atma gibi durumlarda tekrar tekrar çalışmaz.
Olaydan kısaca bahsetmek gerekirse; oyun açıkken bazı pack dosyaları açılıp düzenlenebiliyor. Bu durum bazı istisnai durumlarda sorun teşkil edebilir.
Çoğu zaman cache sebebiyle yapılan değişiklikler client resetlenmediği sürece oyuna yansımayabiliyor fakat yinede bu durumu engellemenin zararı olmaz diye düşündüm.
Ek olarak; günümüzde zaten foxfs vb. yöntemler kullanılmaktadır, dolayısıyla bunu oyununuz için ek güvenlik olarak da düşünebilirsiniz.
Kodlar tamamen geliştirmeye ve özelleştirmeye açık bir yapıdadır, istediğiniz doğrultuda ilerletebilirsiniz.
Bu yöntemin autopatcher ile beraber daha sağlıklı çalışacağını belirtmeliyim. Yani burada sizlere de iş düşüyor, benim burada paylaştığım kodlar bu sistemin ilk aşamasıdır. Bu kodlara bağlı olarak autopatcherda yapacağınız gerekli düzenlemeler ise ikinci aşama olacak.
Çalışma mantığından örnek vermek gerekirse; x adlı pack dosyası düzenlendiği anda oyun tamamen kapanacak, ve tekrar açılırken autopatcher(dosya bütünlüğü özelliği vb. mevcutsa) bu düzenlenmiş pack dosyanın yerine orjinalini indirecek ve orjinal dosyadan giriş yapılmasını sağlayacak.
Tekrar aynı şekilde pack dosyalarına müdahele söz konusu olursa bu işlemler otomatik tekrarlanacak. (Bu benim önerdiğim fikirdir, isteyenler istediği şekilde kullanabilir.)
Şimdi konuya geçelim..
Düzenlemeden önceki halini gösteren kısa bir video:
EterPack/EterPackManager.h açın ve #include listesine ekleyin:
C++:
#include "../UserInterface/Locale_inc.h"
Şu fonksiyonu bulun:
C++:
const char * GetRootPackFileName();
Altına ekleyin:
C++:
#ifdef ENABLE_PACK_SECURITY
void StorePackFile(std::string szFileName);
bool CheckPackFile();
struct PackFileInfo
{
std::string filename;
size_t size;
};
std::vector<PackFileInfo> fileInfoVec;
#endif
EterPackManager.cpp açın ve #include listesine ekleyin:
C++:
#ifdef ENABLE_PACK_SECURITY
#include <fstream>
#endif
Şu kısmı bulun ( CEterPackManager::RegisterPack fonksiyonu içinde) :
C++:
if (pEterPack->Create(m_FileDict, c_szName, c_szDirectory, bReadOnly, c_pbIV))
{
m_PackMap.insert(TEterPackMap::value_type(c_szName, pEterPack));
}
m_PackMap.insert satırının altına ekleyin:
C++:
#ifdef ENABLE_PACK_SECURITY
std::string pFile = std::string(c_szName) + ".eix";
StorePackFile(pFile);
#endif
Daha sonra RegisterPack fonksiyonunun altına ekleyin:
C++:
#ifdef ENABLE_PACK_SECURITY
void CEterPackManager::StorePackFile(std::string szFileName)
{
std::ifstream fileStream(szFileName, std::ios::binary | std::ios::ate);
if (fileStream.is_open())
{
size_t fileInf_t = fileStream.tellg();
fileStream.close();
PackFileInfo info;
info.filename = szFileName;
info.size = fileInf_t;
fileInfoVec.push_back(info);
#ifdef _DEBUG
TraceError("OKUNDU : %s", szFileName.c_str());
#endif
}
else
{
#ifdef _DEBUG
TraceError("HATA! - OKUNAMADI : %s", szFileName.c_str());
#endif
/****************************************
Dusuk bir ihtimal de olsa eger bu hata alindiysa calismiyor ve bu haliyle calismayacak demektir. Calismamasi oyunu etkilemeyecektir.
Lutfen yapilan islemleri, kodlari ve pack uyumlulugunu gozden gecirin.
Hatayi almaya devam ederseniz veya sebebini bulamadiysaniz kodları tamamen kaldirin.
*****************************************/
TraceError("EterPackManager::StorePackFile - ERROR! (0x003)");
TraceError("");
TraceError("<< Lutfen bu hatayi yoneticiye bildirin. >>");
// return;
}
}
bool CEterPackManager::CheckPackFile()
{
for (const auto& storedFile : fileInfoVec)
{
size_t currentSize = GetFileSize(storedFile.filename.c_str());
if (currentSize != storedFile.size)
{
TraceError("Kritik islem tespit edildi!");
return false;
}
}
return true;
}
#endif
Son olarak UserInterface/PythonApplication.cpp içinde şu kısmı bulun:
C++:
void CPythonApplication::RenderGame()
{
Parantezin altına ekleyin:
C++:
#ifdef ENABLE_PACK_SECURITY
bool t = CEterPackManager::Instance().CheckPackFile();
if (!t)
{
CEterPackManager::Instance().fileInfoVec.clear();
Abort();
}
#endif
Düzenleme sonrasını gösteren video ise aşağıdadır:
Meraklısına; Kodlar client açılırken sadece bir defa çalışır ve oyun(client) açık olduğu sürece sadece pack dosyalarının takibini yapar. Yani ışınlanma,karakter atma gibi durumlarda tekrar tekrar çalışmaz.