Agora Metin2 1
Agora Metin2
Bvural41 1
Bvural41
Mt2Hizmet 1
Mt2Hizmet
SLyFeLLowTR 1
SLyFeLLowTR
DEVLOPER 1
DEVLOPER
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Hikaye Ekle

Cevaplanmadı giymeli efekt sistemi

  • Konuyu başlatan Konuyu başlatan classone45
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 20
  • Görüntüleme Görüntüleme 503

HERAKLES Otomatik Avlı kalıcı sunucu. 19 Haziran'da açılıyor. Atius & Wizard güvencesiyle hemen kayıt ol, ön kayıt ödülleri aktif. HEMEN TIKLA!

Ben, giyilebilir silah ve zırh efektlerini ekledim. Sonra, kemerin yanındaki iki slota bir şey takılamıyordu; ben de oraya tanımladım:
  • COSTUME_WING → Silah efekti
  • COSTUME_CAPE → Zırh efekti
  • COSTUME_ACCE → Kanat Efekti
Şu an silah efektini takıyorum, ancak COSTUME_ACCE slotundaki GR2 kanatlarımın görünümü gidiyor.
Shining olarak ekli olanların görünümü gitmiyor, ama GR2 olanlar kayboluyor.


Bunu nasıl çözebilirim?
 
Son düzenleme:
malesef yine olmadı sorun başka dosyada mı acaba :(
Sana daha önce verilen yanıttaki teşhis doğru, fakat kod hatalı.

Sana verilen kod, büyük ihtimalle bir yerden kopyalanırken bozulmuş. İçinde pItem->GetType() =#ifdefmData gibi anlamsız, programlamada yeri olmayan ifadeler var. O bozuk kodla sonuç alman zaten imkansız.

Sorunu çözmek için else if mantığını, her kostümü bağımsız kontrol edecek if blokları ile değiştirmeliyiz.

Aşağıda sana çalışan ve temizlenmiş kodu veriyorum. Şu adımları izle:

* Client source dosyalarından InstanceBase.cpp dosyasını aç.
* Dosyanın içindeki void CInstanceBase::__GetShiningEffect ile başlayan fonksiyonu bul ve baştan sona tamamen sil.
* Aşağıdaki verdiğim kod bloğunun tamamını, sildiğin yere yapıştır.

Kod:
// --- TEMİZ KOD ---
void CInstanceBase::__GetShiningEffect(CItemData* pItem)
{
    bool removeRefineEffect = true;

    CItemData::TItemShiningTable shiningTable = pItem->GetItemShiningTable();

    if (pItem->GetType() == CItemData::ITEM_TYPE_WEAPON)
    {
        __ClearWeaponShiningEffect();
        for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
        {
            if (strcmp(shiningTable.szShinings[i], ""))
            {
                bool twoSidedWeapon = pItem->GetSubType() == CItemData::WEAPON_DAGGER || (IsMountingHorse() && pItem->GetSubType() == CItemData::WEAPON_FAN);
                if (twoSidedWeapon)
                {
                    __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON_LEFT");
                }

                if (pItem->GetSubType() == CItemData::WEAPON_BOW)
                    __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON_LEFT");
                else
                    __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON");
            }
        }
    }
    else if (pItem->GetType() == CItemData::ITEM_TYPE_COSTUME)
    {
#ifdef ENABLE_WINGS_NEW
        if (pItem->GetSubType() == CItemData::COSTUME_WING)
        {
            __ClearWingShiningEffect();
            for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
                if (strcmp(shiningTable.szShinings[i], ""))
                    if (pItem->GetIndex() == 16064)
                        __AttachWingShiningEffect(i, shiningTable.szShinings[i], "Bip01");
                    else
                        __AttachWingShiningEffect(i, shiningTable.szShinings[i], "Bip01 Spine2");
        }
#endif

#ifdef ENABLE_ACCE_SYSTEM
        if (pItem->GetSubType() == CItemData::COSTUME_ACCE)
        {
            for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
                if (strcmp(shiningTable.szShinings[i], ""))
                    if (pItem->GetIndex() >= 86066 && pItem->GetIndex() <= 86080)
                        __AttachAcceShiningEffect(i, shiningTable.szShinings[i], "Bip01 Spine2");
                    else
                        __AttachAcceShiningEffect(i, shiningTable.szShinings[i], "Bip01");
        }
#endif

#ifdef ENABLE_AURA_SYSTEM
        if (pItem->GetSubType() == CItemData::COSTUME_AURA)
        {
            __ClearAuraShiningEffect();
            for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
                if (strcmp(shiningTable.szShinings[i], ""))
                    __AttachAuraShiningEffect(i, shiningTable.szShinings[i], "Bip01 Spine2");
        }
#endif

        if (pItem->GetSubType() == CItemData::COSTUME_BODY)
        {
            if (removeRefineEffect)
                __ClearArmorRefineEffect();

            for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
                if (strcmp(shiningTable.szShinings[i], ""))
                    __AttachArmorShiningEffect(i, shiningTable.szShinings[i]);
        }
#ifdef ENABLE_WEAPON_COSTUME_SYSTEM
        if (pItem->GetSubType() == CItemData::COSTUME_WEAPON)
        {
            __ClearWeaponShiningEffect();
            if (removeRefineEffect)
                __ClearWeaponRefineEffect();

            for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
            {
                if (strcmp(shiningTable.szShinings[i], ""))
                {
                    bool twoSidedWeapon = pItem->GetValue(3) == CItemData::WEAPON_DAGGER || (IsMountingHorse() && pItem->GetValue(3) == CItemData::WEAPON_FAN);
                    if (twoSidedWeapon)
                        __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON_LEFT");

                    if (pItem->GetValue(3) == CItemData::WEAPON_BOW)
                        __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON_LEFT");
                    else
                        __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON");
                }
            }
        }
#endif
    }
    else
    {
        if (removeRefineEffect)
            __ClearArmorRefineEffect();

        for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
            if (strcmp(shiningTable.szShinings[i], ""))
                __AttachArmorShiningEffect(i, shiningTable.szShinings[i]);
    }
}


4- Dosyayı kaydet ve client'ini yeniden build al.

Sorunun büyük ihtimalle çözülecektir. Kolay gelsin.
 
Sana daha önce verilen yanıttaki teşhis doğru, fakat kod hatalı.

Sana verilen kod, büyük ihtimalle bir yerden kopyalanırken bozulmuş. İçinde pItem->GetType() =#ifdefmData gibi anlamsız, programlamada yeri olmayan ifadeler var. O bozuk kodla sonuç alman zaten imkansız.

Sorunu çözmek için else if mantığını, her kostümü bağımsız kontrol edecek if blokları ile değiştirmeliyiz.

Aşağıda sana çalışan ve temizlenmiş kodu veriyorum. Şu adımları izle:

* Client source dosyalarından InstanceBase.cpp dosyasını aç.
* Dosyanın içindeki void CInstanceBase::__GetShiningEffect ile başlayan fonksiyonu bul ve baştan sona tamamen sil.
* Aşağıdaki verdiğim kod bloğunun tamamını, sildiğin yere yapıştır.

Kod:
// --- TEMİZ KOD ---
void CInstanceBase::__GetShiningEffect(CItemData* pItem)
{
    bool removeRefineEffect = true;

    CItemData::TItemShiningTable shiningTable = pItem->GetItemShiningTable();

    if (pItem->GetType() == CItemData::ITEM_TYPE_WEAPON)
    {
        __ClearWeaponShiningEffect();
        for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
        {
            if (strcmp(shiningTable.szShinings[i], ""))
            {
                bool twoSidedWeapon = pItem->GetSubType() == CItemData::WEAPON_DAGGER || (IsMountingHorse() && pItem->GetSubType() == CItemData::WEAPON_FAN);
                if (twoSidedWeapon)
                {
                    __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON_LEFT");
                }

                if (pItem->GetSubType() == CItemData::WEAPON_BOW)
                    __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON_LEFT");
                else
                    __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON");
            }
        }
    }
    else if (pItem->GetType() == CItemData::ITEM_TYPE_COSTUME)
    {
#ifdef ENABLE_WINGS_NEW
        if (pItem->GetSubType() == CItemData::COSTUME_WING)
        {
            __ClearWingShiningEffect();
            for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
                if (strcmp(shiningTable.szShinings[i], ""))
                    if (pItem->GetIndex() == 16064)
                        __AttachWingShiningEffect(i, shiningTable.szShinings[i], "Bip01");
                    else
                        __AttachWingShiningEffect(i, shiningTable.szShinings[i], "Bip01 Spine2");
        }
#endif

#ifdef ENABLE_ACCE_SYSTEM
        if (pItem->GetSubType() == CItemData::COSTUME_ACCE)
        {
            for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
                if (strcmp(shiningTable.szShinings[i], ""))
                    if (pItem->GetIndex() >= 86066 && pItem->GetIndex() <= 86080)
                        __AttachAcceShiningEffect(i, shiningTable.szShinings[i], "Bip01 Spine2");
                    else
                        __AttachAcceShiningEffect(i, shiningTable.szShinings[i], "Bip01");
        }
#endif

#ifdef ENABLE_AURA_SYSTEM
        if (pItem->GetSubType() == CItemData::COSTUME_AURA)
        {
            __ClearAuraShiningEffect();
            for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
                if (strcmp(shiningTable.szShinings[i], ""))
                    __AttachAuraShiningEffect(i, shiningTable.szShinings[i], "Bip01 Spine2");
        }
#endif

        if (pItem->GetSubType() == CItemData::COSTUME_BODY)
        {
            if (removeRefineEffect)
                __ClearArmorRefineEffect();

            for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
                if (strcmp(shiningTable.szShinings[i], ""))
                    __AttachArmorShiningEffect(i, shiningTable.szShinings[i]);
        }
#ifdef ENABLE_WEAPON_COSTUME_SYSTEM
        if (pItem->GetSubType() == CItemData::COSTUME_WEAPON)
        {
            __ClearWeaponShiningEffect();
            if (removeRefineEffect)
                __ClearWeaponRefineEffect();

            for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
            {
                if (strcmp(shiningTable.szShinings[i], ""))
                {
                    bool twoSidedWeapon = pItem->GetValue(3) == CItemData::WEAPON_DAGGER || (IsMountingHorse() && pItem->GetValue(3) == CItemData::WEAPON_FAN);
                    if (twoSidedWeapon)
                        __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON_LEFT");

                    if (pItem->GetValue(3) == CItemData::WEAPON_BOW)
                        __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON_LEFT");
                    else
                        __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON");
                }
            }
        }
#endif
    }
    else
    {
        if (removeRefineEffect)
            __ClearArmorRefineEffect();

        for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
            if (strcmp(shiningTable.szShinings[i], ""))
                __AttachArmorShiningEffect(i, shiningTable.szShinings[i]);
    }
}


4- Dosyayı kaydet ve client'ini yeniden build al.

Sorunun büyük ihtimalle çözülecektir. Kolay gelsin.
build alıyor ama sorun devam ediyor
 
Bu dosyayı yazan veya düzenleyen kişi, COSTUME_WING bloğunun içini adeta bir çorbaya çevirmiş. Sorun sadece yanlış fonksiyonu çağırmak değil, o bloğun tamamı mantıksal olarak hatalı

__ClearWingShiningEffect() kanatları siliyor.Kodun bir bölümü, COSTUME_WING (silah efekti) slotu için __AttachAcceShiningEffect fonksiyonunu, yani kuşak efektini eklemeye çalışıyor. Bu, başka bir çapraz ateş ve gelecekte kuşaklarla ilgili bir soruna kesinlikle yol açar.
Diğer tüm bloklarda olan if (strcmp(shiningTable.szShinings, "")) kontrolü burada yok. Bu, tanımlanmamış bir efekt eklemeye çalışarak oyunu çökertebilir veya performans sorunları yaratabilirsin

Bu sorunu çözmek için sadece yara bandı yapıştırmak yetmez. Bu çorba gibi olmuş bloğu tamamen atıp, yerine doğru çalışan, temiz bir kod yazmalıyız.

InstanceBase.cpp dosyasındaki __GetShiningEffect fonksiyonunu bul. İçindeki if (pItem->GetSubType() == CItemData::COSTUME_WING) ile başlayan bloğun tamamını sil ve yerine aşağıdaki doğru kodu yapıştır.

[CODE title="C++"]// --- DOĞRU VE TEMİZ KOD ---
#ifdef ENABLE_WINGS_NEW
// Bu blok, kullanıcı tarafından SİLAH EFEKTİ #ifdef kullanıldığı için
// kanatlarla ilgili hiçbir işlem yapmamalıdır.
if (pItem->GetSubType() == CItemData::COSTUME_WING)
{
// Kanatları değil, SADECE SİLAH efektlerini temizle.
__ClearWeaponShiningEffect();

for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
{
// Efektin tanımlı olup olmadığını kontrol et.
if (strcmp(shiningTable.szShinings, ""))
{
bool twoSidedWeapon = pItem->GetSubType() == CItemData::WEAPON_DAGGER || (IsMountingHorse() && pItem->GetSubType() == CItemData::WEAPON_FAN);
if (twoSidedWeapon)
{
__AttachWeaponShiningEffect(i, shiningTable.szShinings, "PART_WEAPON_LEFT");
}

if (pItem->GetSubType() == CItemData::WEAPON_BOW)
__AttachWeaponShiningEffect(i, shiningTable.szShinings, "PART_WEAPON_LEFT");
else
__AttachWeaponShiningEffect(i, shiningTable.szShinings, "PART_WEAPON");
}
}
}
#endif[/CODE]

Bu kod ile sadece kanatların kaybolmasını engellemekle kalmıyor, aynı zamanda gelecekt#endifk efektleriyle yaşanacak bir sorunu da önlemiş oluyor tam bir temizlik diyelim.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst