Çözüldü Acce (Kuşak) Sistem Client kapanması

  • Konuyu açan Konuyu açan dePayens
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 7
  • Gösterim Gösterim 320
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ı.

dePayens

Üye
Üye
Mesaj
53
Çözümler
2
Beğeni
10
Puan
444
Ticaret Puanı
0
Sistemi ekledim ancak oyuna giriş yaparken karakter ekranına girmeden oyun kapanıyordu. Debug mod ile denediğimde ise şu hatayı verdi :

resim_2024-01-31_190907801.png


dwPos'u arattığımda ise şu kodlar çıkıyor karşıma :

ItemData.cpp:
Genişlet Daralt Kopyala
#ifdef ENABLE_ACCE_SYSTEM
void CItemData::SetItemScale(const std::string strJob, const std::string strSex, const std::string strScaleX, const std::string strScaleY, const std::string strScaleZ, const std::string strPositionX, const std::string strPositionY, const std::string strPositionZ)
{
    DWORD dwPos;
    if (strJob == "JOB_WARRIOR")
        dwPos = NRaceData::JOB_WARRIOR;
    else if (strJob == "JOB_ASSASSIN")
        dwPos = NRaceData::JOB_ASSASSIN;
    else if (strJob == "JOB_SURA")
        dwPos = NRaceData::JOB_SURA;
    else if (strJob == "JOB_SHAMAN")
        dwPos = NRaceData::JOB_SHAMAN;
    else
        dwPos = NRaceData::JOB_WOLFMAN;
   
    dwPos += 1;
    if (strSex == "F")
        dwPos += 5;
   
    m_ScaleTable.tInfo[dwPos].fScaleX = float(atof(strScaleX.c_str()) / 100.0f);
    m_ScaleTable.tInfo[dwPos].fScaleY = float(atof(strScaleY.c_str()) / 100.0f);
    m_ScaleTable.tInfo[dwPos].fScaleZ = float(atof(strScaleZ.c_str()) / 100.0f);
    m_ScaleTable.tInfo[dwPos].fPositionX = float(atof(strPositionX.c_str()) * 100.0f);
    m_ScaleTable.tInfo[dwPos].fPositionY = float(atof(strPositionY.c_str()) * 100.0f);
    m_ScaleTable.tInfo[dwPos].fPositionZ = float(atof(strPositionZ.c_str()) * 100.0f);
}

bool CItemData::GetItemScale(DWORD dwPos, float & fScaleX, float & fScaleY, float & fScaleZ, float & fPositionX, float & fPositionY, float & fPositionZ)
{
    fScaleX = m_ScaleTable.tInfo[dwPos].fScaleX;
    fScaleY = m_ScaleTable.tInfo[dwPos].fScaleY;
    fScaleZ = m_ScaleTable.tInfo[dwPos].fScaleZ;
    fPositionX = m_ScaleTable.tInfo[dwPos].fPositionX;
    fPositionY = m_ScaleTable.tInfo[dwPos].fPositionY;
    fPositionZ = m_ScaleTable.tInfo[dwPos].fPositionZ;
    return true;
}
#endif
InstanceBase.cpp:
Genişlet Daralt Kopyala
#ifdef ENABLE_ACCE_SYSTEM
void CInstanceBase::SetAcce(DWORD dwAcce)
{
    if (!IsPC())
        return;
   
    if (IsPoly())
        return;
   
    dwAcce += 85000;
    ClearAcceEffect();
   
    float fSpecular = 65.0f;
    if (dwAcce > 86000)
    {
        dwAcce -= 1000;
        fSpecular += 35;
       
        m_dwAcceEffect = EFFECT_REFINED + EFFECT_ACCE;
        __EffectContainer_AttachEffect(m_dwAcceEffect);
    }
   
    fSpecular /= 100.0f;
    m_awPart[CRaceData::PART_ACCE] = dwAcce;
   
    CItemData * pItemData;
    if (!CItemManager::Instance().GetItemDataPointer(dwAcce, &pItemData))
        return;
   
    m_GraphicThingInstance.AttachAcce(pItemData, fSpecular);
    #ifdef ENABLE_OBJ_SCALLING
    DWORD dwRace = GetRace(), dwPos = RaceToJob(dwRace), dwSex = RaceToSex(dwRace);
    dwPos += 1;
    if (dwSex == 0)
        dwPos += 5;
   
    float fScaleX, fScaleY, fScaleZ, fPositionX, fPositionY, fPositionZ;
    if (pItemData->GetItemScale(dwPos, fScaleX, fScaleY, fScaleZ, fPositionX, fPositionY, fPositionZ))
    {
        m_GraphicThingInstance.SetScale(fScaleX, fScaleY, fScaleZ, true);
        if (m_kHorse.IsMounting())
            fPositionZ += 10.0f;
       
        m_GraphicThingInstance.SetScalePosition(fPositionX, fPositionY, fPositionZ);
    }
    #endif
}
Yardım edebilir misiniz?
 
Çözüm
Bu sistemin kodları biraz tuhaf geldi bana, yani sorgu tipleri falan garip gibi. Ayrıca kostüm silahlarıyla hiç bir şekilde çakışmaması lazım normalde.
Ama şu şekilde değiştirip deneyebilirsin.

C++:
Genişlet Daralt Kopyala
        if ((item->GetSubType() != COSTUME_ACCE) && (weapon->GetSubType() + COSTUME_WEAPON_SWORD != item->GetSubType())
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You must equip costume weapon with same type of weapon"));
            return false;
        }
COSTUME_ACCE yazan yer senin dosyalarında nasıl tanımlıysa o şekilde değiştir.
eğer dosyalarında wolfman yoksa wolfman satırını silip shaman satırını wolfman gibi yapmalısın, dwpos değerinide 5 den 4 e çek sonra tekrar dene
 
Oyununda Wolfman karakteri yoksa, wolfman ile ilgili her şeyi kaldır.
locale içerisindeki item_scale.txt dahil.
 
Dediklerinizi yaptım ve sorun çözüldü. Ancak şimdi de Costume Weapon ile çakıştı. Kuşağı takmaya çalıştığımda " You must equip costume weapon with same type of weapon " locale_stringini veriyor.
İlgili kod bloğu :
C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_COSTUME_WEAPON_SYSTEM
    if (item->GetType() == ITEM_COSTUME && item->GetSubType() >= COSTUME_WEAPON_SWORD)
    {
        LPITEM weapon = GetWear(WEAR_WEAPON);
        if (!weapon)
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You must equip weapon first"));
            return false;
        }
        if (weapon->GetSubType() + COSTUME_WEAPON_SWORD != item->GetSubType())
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You must equip costume weapon with same type of weapon"));
            return false;
        }
    }
    if (item->GetType() == ITEM_WEAPON)
    {
        LPITEM weapon = GetWear(WEAR_COSTUME_WEAPON);
        if (weapon)
        {
            if (weapon->GetSubType() - COSTUME_WEAPON_SWORD != item->GetSubType())
            {
                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You must equip weapon with same type of costume"));
                return false;
            }
        }
    }
#endif
Nasıl çözüme kavuşturabilirim? Her yolu denedim uygun algoritmayı kuramadım.
 
Böyle durumlarda, problemi parçalara ayırmak ve sorunun asıl kaynağını tespit etmek için debug mesajları koyarsın.
log koymak uğraştırır, ChatPacket yolla, 2 farklı koşulda aynı uyarı veriliyor. Hangisinin çalıştığını tespit et, sonrasında çözüm için düşünürüz.
Neyle uğraştımızı bilmemiz lazım.
 
C++:
Genişlet Daralt Kopyala
    DWORD dwPos;
    if (strJob == "JOB_WARRIOR")
        dwPos = NRaceData::JOB_WARRIOR;
    else if (strJob == "JOB_ASSASSIN")
        dwPos = NRaceData::JOB_ASSASSIN;
    else if (strJob == "JOB_SURA")
        dwPos = NRaceData::JOB_SURA;
    else if (strJob == "JOB_SHAMAN")
        dwPos = NRaceData::JOB_SHAMAN;
    else
        dwPos = NRaceData::JOB_WOLFMAN;
 
    dwPos += 1;
    if (strSex == "F")
        dwPos += 5;

Hata büyük ihtimalle buradan geliyor. dwPos değeri başlatılmamış. Ve if satırlarını görmezden gelirsek fonksiyon içinde dwPos += 1; güncellemesi yapılmış.
Program, bu if'lerin hepsinin false dönmesi durumunda yani eğer hiç biri karşılanmazsa bu veriyi(dwPos += 1 satırını) güncelleyecek bir başlangıç değeri bulamadığı için riske atmadan kodu çalıştırmadan durduruyor. Hatada da bunu söylemiş zaten.

Özetle;
C++:
Genişlet Daralt Kopyala
DWORD dwPos;

Bu kısmı şu şekilde değiştir:
C++:
Genişlet Daralt Kopyala
DWORD dwPos = 0;

Eğer sorunun kaynağı bu kodlar ise muhtemelen sorunun çözülecektir.
 
C++:
Genişlet Daralt Kopyala
    DWORD dwPos;
    if (strJob == "JOB_WARRIOR")
        dwPos = NRaceData::JOB_WARRIOR;
    else if (strJob == "JOB_ASSASSIN")
        dwPos = NRaceData::JOB_ASSASSIN;
    else if (strJob == "JOB_SURA")
        dwPos = NRaceData::JOB_SURA;
    else if (strJob == "JOB_SHAMAN")
        dwPos = NRaceData::JOB_SHAMAN;
    else
        dwPos = NRaceData::JOB_WOLFMAN;
 
    dwPos += 1;
    if (strSex == "F")
        dwPos += 5;

Hata büyük ihtimalle buradan geliyor. dwPos değeri başlatılmamış. Ve if satırlarını görmezden gelirsek fonksiyon içinde dwPos += 1; güncellemesi yapılmış.
Program, bu if'lerin hepsinin false dönmesi durumunda yani eğer hiç biri karşılanmazsa bu veriyi(dwPos += 1 satırını) güncelleyecek bir başlangıç değeri bulamadığı için riske atmadan kodu çalıştırmadan durduruyor. Hatada da bunu söylemiş zaten.

Özetle;
C++:
Genişlet Daralt Kopyala
DWORD dwPos;

Bu kısmı şu şekilde değiştir:
C++:
Genişlet Daralt Kopyala
DWORD dwPos = 0;

Eğer sorunun kaynağı bu kodlar ise muhtemelen sorunun çözülecektir.
Bu kısım halledildi. Yukarıdaki yazılanlar çözüm oldu. Ancak hala şu sorun devam ediyor
Dediklerinizi yaptım ve sorun çözüldü. Ancak şimdi de Costume Weapon ile çakıştı. Kuşağı takmaya çalıştığımda " You must equip costume weapon with same type of weapon " locale_stringini veriyor.
İlgili kod bloğu :
C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_COSTUME_WEAPON_SYSTEM
    if (item->GetType() == ITEM_COSTUME && item->GetSubType() >= COSTUME_WEAPON_SWORD)
    {
        LPITEM weapon = GetWear(WEAR_WEAPON);
        if (!weapon)
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You must equip weapon first"));
            return false;
        }
        if (weapon->GetSubType() + COSTUME_WEAPON_SWORD != item->GetSubType())
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You must equip costume weapon with same type of weapon"));
            return false;
        }
    }
    if (item->GetType() == ITEM_WEAPON)
    {
        LPITEM weapon = GetWear(WEAR_COSTUME_WEAPON);
        if (weapon)
        {
            if (weapon->GetSubType() - COSTUME_WEAPON_SWORD != item->GetSubType())
            {
                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You must equip weapon with same type of costume"));
                return false;
            }
        }
    }
#endif
Nasıl çözüme kavuşturabilirim? Her yolu denedim uygun algoritmayı kuramadım.
 
Bu sistemin kodları biraz tuhaf geldi bana, yani sorgu tipleri falan garip gibi. Ayrıca kostüm silahlarıyla hiç bir şekilde çakışmaması lazım normalde.
Ama şu şekilde değiştirip deneyebilirsin.

C++:
Genişlet Daralt Kopyala
        if ((item->GetSubType() != COSTUME_ACCE) && (weapon->GetSubType() + COSTUME_WEAPON_SWORD != item->GetSubType())
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You must equip costume weapon with same type of weapon"));
            return false;
        }
COSTUME_ACCE yazan yer senin dosyalarında nasıl tanımlıysa o şekilde değiştir.
 
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Üst