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

Kaiser

⋞ 〈 ☪ 〉 ⋟
Yönetici
Premium Üye
Geliştirici
Yardımsever Üye
Editör
Mesaj
3.659
Çözümler
343
Beğeni
3.499
Puan
1.849


InstanceBaseBattle.cpp arayın:
C++:
BOOL CInstanceBase::CheckAdvancing()
{

Altına ekleyin:
C++:
    if (IsPC() && IsGameMaster() && IsWalking())
        return false;

PythonBackground.cpp arayın:
C++:
bool CPythonBackground::CheckAdvancing(CInstanceBase * pInstance)
{

Altına ekleyin:
C++:
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ı konu olmuş teşekkürler. Sabite alındı (y)
 
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:
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:
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++:
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++:
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++:
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++:
 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++:
if (!IsMapReady())
    return true;

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