Yardım Renewal Affect Shower Sistemi Çalışmayan Kod Bloğu

  • Konuyu açan Konuyu açan Uitwaa1en
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 2
  • Gösterim Gösterim 178
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

Uitwaa1en

Üye
Üye
Mesaj
13
Beğeni
2
Puan
415
Ticaret Puanı
0
cmd_general.cpp Çalışmayan Kod Bloğu:
Genişlet Daralt Kopyala
ACMD(do_remove_affect)
{
    std::vector<std::string> vecArgs;
    split_argument(argument, vecArgs);
    if (vecArgs.size() < 2) { return; }
    DWORD affect = 0;
    str_to_number(affect, vecArgs[1].c_str());
    if (AFFECT_POLYMORPH == affect)
    {
        if (!ch->IsPolymorphed())
            return;
        ch->SetPolymorph(0);
    }
    if(ch->FindAffect(affect))
        ch->RemoveAffect(affect);
}


cmd_general.cpp Çalışan Kod Bloğu:
Genişlet Daralt Kopyala
ACMD(do_remove_affect)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    if (!ch)
        return;

    int affect = 0;
    str_to_number(affect, arg1);
    CAffect* pAffect = ch->FindAffect(affect);

    if (pAffect)
        ch->RemoveAffect(affect);
}
En üstteki kod bloğu neden çalışmıyor. Build almada hiçbir sıkıntı yok.
 
İkinci kod bloğunun çalıştığını, ancak ilk kod bloğunun çalışmadığını belirtmiştin. Şimdi, iki kod bloğu arasındaki farkları ve ilk kodun neden çalışmadığını açıklayalım.

1. Kod Bloğundaki Sorunlar​

Kod:
Genişlet Daralt Kopyala
ACMD(do_remove_affect)

{

    std::vector<std::string> vecArgs;

    split_argument(argument, vecArgs);

    if (vecArgs.size() < 2) { return; }

    DWORD affect = 0;

    str_to_number(affect, vecArgs[1].c_str());

    if (AFFECT_POLYMORPH == affect)

    {

        if (!ch->IsPolymorphed())

            return;

        ch->SetPolymorph(0);

    }

    if(ch->FindAffect(affect))

        ch->RemoveAffect(affect);

}

Sorunun Olası Nedenleri:​

  1. Argument Parsing (split_argument):
    • İlk kod bloğunda split_argument() fonksiyonunu kullanıyorsun, ancak bu fonksiyon argument değişkenini doğru şekilde ayrıştırmıyor olabilir. Eğer vecArgs vektörü beklediğin şekilde dolmazsa, vecArgs[1] erişimi hataya neden olur.
  2. ch Nesnesinin Kontrolü:
    • İlk kod bloğunda ch nesnesinin geçerli olup olmadığını kontrol etmiyorsun. Eğer ch nullptr ise, ch-&gt;FindAffect() ve ch-&gt;RemoveAffect() çağrıldığında çökme (crash) meydana gelebilir.
  3. Affect ID'nin Türü:
    • İlk kodda DWORD affect kullanıyorsun, ancak str_to_number() ile DWORD türüne çevirme yapıyorsun. Bu işlem sırasında uyumsuz bir tür kullanımı söz konusu olabilir. İkinci kodda ise int affect kullanılıyor.

2. Çalışan Kod Bloğu​

Kod:
Genişlet Daralt Kopyala
ACMD(do_remove_affect)

{

    char arg1[256];

    one_argument(argument, arg1, sizeof(arg1));



    if (!*arg1)

        return;



    if (!ch)

        return;



    int affect = 0;

    str_to_number(affect, arg1);

    CAffect* pAffect = ch->FindAffect(affect);



    if (pAffect)

        ch->RemoveAffect(affect);

}

Neden Çalışıyor?​

  1. Daha Basit Argument Parsing (one_argument):
    • one_argument() fonksiyonu, argument değişkenini çok daha basit bir şekilde ayrıştırıyor ve sadece bir argümanı alıyor. Bu nedenle daha güvenilir ve daha az hata riski taşıyor.
  2. ch Kontrolü:
    • İkinci kodda, ch nesnesinin nullptr olup olmadığı kontrol ediliyor. Bu sayede, karakter objesi geçersiz olduğunda FindAffect() ve RemoveAffect() fonksiyonlarına erişilmiyor.
  3. Doğru Tür Kullanımı:
    • str_to_number() fonksiyonu ile int affect kullanılıyor. Tür uyumu, DWORD yerine int kullanarak sağlanmış.

İlk Kodu Düzeltme​

Aşağıda, ilk kod bloğunu düzeltmek için yapılabilecek değişiklikler yer alıyor:

Kod:
Genişlet Daralt Kopyala
ACMD(do_remove_affect)

{

    if (!ch) return; // 'ch' kontrolü eklendi



    std::vector<std::string> vecArgs;

    split_argument(argument, vecArgs);

    if (vecArgs.size() < 2) return;



    int affect = 0; // 'DWORD' yerine 'int' kullanıldı

    str_to_number(affect, vecArgs[1].c_str());



    if (AFFECT_POLYMORPH == affect)

    {

        if (!ch->IsPolymorphed())

            return;

        ch->SetPolymorph(0);

    }



    if (ch->FindAffect(affect))

        ch->RemoveAffect(affect);

}

Özet​

  • split_argument() yerine one_argument() kullanmak, daha güvenilir ve basit bir çözüm sunar.
  • ch kontrolü eklenmeli.
  • DWORD yerine int kullanmak, tür uyuşmazlıklarını önler.
Bu değişikliklerle ilk kod bloğunun çalışması gerektiğini düşünüyorum.
 
Adamın yasaklanmış olması kötü olmuş. Bu açıklayıcı cevabı için teşekkür ederim.
 
Son düzenleme:
Geri
Üst