[GM] Her Şeyin İçinden Geçme

  • Konuyu açan Konuyu açan Kaiser
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 11
  • Gösterim Gösterim 3K

Kaiser

Admin
Admin
Geliştirici
Yardımsever Üye
Mesaj
3.961
Çözümler
381
Beğeni
4.021
Puan
1.849
Ticaret Puanı
0


InstanceBaseBattle.cpp arayın:
C++:
Genişlet Daralt Kopyala
BOOL CInstanceBase::CheckAdvancing()
{

Altına ekleyin:
C++:
Genişlet Daralt Kopyala
    if (IsPC() && IsGameMaster() && IsWalking())
        return false;

PythonBackground.cpp arayın:
C++:
Genişlet Daralt Kopyala
bool CPythonBackground::CheckAdvancing(CInstanceBase * pInstance)
{

Altına ekleyin:
C++:
Genişlet Daralt Kopyala
if (pInstance->IsPC() && pInstance->IsGameMaster() && pInstance->IsWalking())
        return false;
 
Allods Online oyununda oyuncular birbirinin içinden geçebiliyordu. Metin2'den sonra bu oyunu oynayan benim için şaşırtıcıydı
 
yararlı ama bunun hep olması yerine kodla açıp kapatılacak şekilde nasıl yapabiliriz
 
Son kısmı bu şekilde düzenlerseniz daha iyi ilk başta map kontrolü yapılması sağlıklı olur:
Genişlet Daralt Kopyala
bool CPythonBackground::CheckAdvancing(CInstanceBase * pInstance)
{
    if (!IsMapReady())
        return true;
#if defined(ENABLE_NO_WALL_FOR_GM)
    if(pInstance->IsPC() && pInstance->IsGameMaster() && pInstance->IsWalking())
        return false;
#endif
    Vector3d center;
    float radius;
 
Son kısmı bu şekilde düzenlerseniz daha iyi ilk başta map kontrolü yapılması sağlıklı olur:
Genişlet Daralt Kopyala
bool CPythonBackground::CheckAdvancing(CInstanceBase * pInstance)
{
    if (!IsMapReady())
        return true;
#if defined(ENABLE_NO_WALL_FOR_GM)
    if(pInstance->IsPC() && pInstance->IsGameMaster() && pInstance->IsWalking())
        return false;
#endif
    Vector3d center;
    float radius;
Bu eklemeyi yapmaya gerek yok çünkü zaten clientte bir çok yerde bu kontrol yapılmış durumdadır. Dolayısıyla buraya gelene kadar neredeyse 40 kez bu kontrol yapılıyor, eğer harita yoksa zaten haritaya erişilemez ve doğal olarak bu konudaki işlemler çalışmaz. Yani bu kodun çalışması için öncelikle haritanın yüklenmiş olması gerekiyor.

Ayrıca burada eklediğin kod ciddi derecede mantık dışıdır.(Kod olarak)
Çünkü;
C++:
Genişlet Daralt Kopyala
if (!IsMapReady())
    return true;

Bunun telaffuzu; eğer map yoksa true döndür/çalıştır. anlamına gelir.
 
Bu eklemeyi yapmaya gerek yok çünkü zaten clientte bir çok yerde bu kontrol yapılmış durumdadır. Dolayısıyla buraya gelene kadar neredeyse 40 kez bu kontrol yapılıyor, eğer harita yoksa zaten haritaya erişilemez ve doğal olarak bu konudaki işlemler çalışmaz. Yani bu kodun çalışması için öncelikle haritanın yüklenmiş olması gerekiyor.

Ayrıca burada eklediğin kod ciddi derecede mantık dışıdır.(Kod olarak)
Çünkü;
C++:
Genişlet Daralt Kopyala
if (!IsMapReady())
    return true;

Bunun telaffuzu; eğer map yoksa true döndür/çalıştır. anlamına gelir.
bool CMapManager::IsMapReady()
{
if (!m_pkMap)
return false;

return m_pkMap->IsReady();
}

kod bloğu bu şekilde olunca true yazması normal olarak görüyorum
 
bool CMapManager::IsMapReady()
{
if (!m_pkMap)
return false;

return m_pkMap->IsReady();
}

kod bloğu bu şekilde olunca true yazması normal olarak görüyorum
C++:
Genişlet Daralt Kopyala
bool CMapManager::IsMapReady()
{
    if (!m_pkMap)
        return false;
    return m_pkMap->IsReady();
}

Bu blok aslında return m_pkMap->IsReady(); ile true döndürülmeye sabitlenmiştir, sadece harita yoksa false döndürecek ve çalışmayacaktır.
Daha genel bahsedecek olursak; her ne sebeple olursa olsun bu fonksiyon bir şekilde false döndürdüğünde harita yok/sorunlu demektir.
Ve biz if(!IsMapReadey()) diye şart koştuğumuzda(eğer harita yoksa diye sormuş oluyoruz), aslında bu bloktaki m_pkMap->IsReady(); kısmını if(!m_pkMap->IsReady()) şeklinde sorgulamış oluyoruz. Ve sonuç false ise kesinlikle bizim sorgumuz da false döndürmelidir. Ki kontrol ettiğimde de client içinde 35 yerde kullanılmış bu sorgu, ve hepsi de bahsettiğim gibi false döndürmekte.

Özetle; eğer IsReady() fonksiyonu;
C++:
Genişlet Daralt Kopyala
 if (!m_pkMap)
    return false;
Bu kısımdan dolayı false döndürürse fonksiyon artık tamamen işlevsiz olmuş olacak ve:
C++:
Genişlet Daralt Kopyala
if (!IsMapReady())
    return true;

Buradaki sorguya gelemeden bir ihtimalle client zaten çökmüş olacaktır veya çoktan syserr vermiş olacaktır.
 
Üst