Kodların arasında sessizce duran Metin2 detayları

Yani doğru yaklaşım bu mudur? Sizden öğrenecek çok şey var hakikatten.
18532 eklentisini görüntüle

Başka bir lüzumsuz hard-coding örneği

C++:
Genişlet Daralt Kopyala
enum EDragonSoulSubType
{
    DS_SLOT1,
    DS_SLOT2,
    DS_SLOT3,
    DS_SLOT4,
    DS_SLOT5,
    DS_SLOT6,
    DS_SLOT_NUM_TYPES = 6,
};
Burada birşey yok enum’a eklediklerin 0’dan başlar(sabit girmediğin sürece) Ama o isim olarak 1 den başlatmış. Yanii

DS_SLOT1 aslında = 0 ‘dır. Ymir bizim babamız ezmeyin bu kadar ahahahaa :)
 


Burada birşey yok enum’a eklediklerin 0’dan başlar(sabit girmediğin sürece) Ama o isim olarak 1 den başlatmış. Yanii

DS_SLOT1 aslında = 0 ‘dır. Ymir bizim babamız ezmeyin bu kadar ahahahaa :)
Sorun o değil. Dinamik olarak zaten o sayıyı alacakken elle 6 yazmışlar. Yeni simya eklemeye çalışsan elinde patlayacak, ara dur ki hata nerede.
 
Sorun o değil. Dinamik olarak zaten o sayıyı alacakken elle 6 yazmışlar. Yeni simya eklemeye çalışsan elinde patlayacak, ara dur ki hata nerede.
Tabii orası öyle zaten ama tahminimce max sayıyı mesela saymak yerine baktığında ha tamam 6 tane var aklında bulundurması için yapmış da olabilir. Bilemiyoruz ki o anda ne düşünerekten yaptı diye ama hangisini düşünerekten yapmışlar ki. 🤣
 
Son düzenleme:
Otomatik item satışı yazarken PickupItem içerisinde bir şey fark ettim. Item in IsOwnership ise item i destroy ediyor, IsOwnership değilse hiç bir şey yapmıyor. Mantığı ne? Ben çözmedim bir türlü yani o itemi oluşturuyorsun ama IsOwnership i değilse ramki bu itemi ne destroy edecek?

18725 eklentisini görüntüle
18722 eklentisini görüntüle
18726 eklentisini görüntüle
İtemin sahibi değilse veya item sahibi kişinin grubunda değilse toplayamaz zaten. Sahibi olmayan itemler zaten IsOwnership fonksiyonundan true olarak sonuç döndüğü için yine o case'a giriyor.
 
İnanılmaz bir oyun, yıllarca dosyalarla uğraşsanız bile hala yeni şeyler (saçmalıklar demeye dilim varmadı) keşfedebiliyorsunuz, ufak bir yolculukla battle.cpp dosyasına bir yolculuk yapalım;

battle.cpp:
Genişlet Daralt Kopyala
float CalcAttackRating (LPCHARACTER pkAttacker, LPCHARACTER pkVictim, bool bIgnoreTargetRating)
{
    int iARSrc;
    int iERSrc;

    int attacker_dx = pkAttacker->GetPolymorphPoint (POINT_DX);
    int attacker_lv = pkAttacker->GetLevel();

    int victim_dx = pkVictim->GetPolymorphPoint (POINT_DX);
    int victim_lv = pkAttacker->GetLevel();

    iARSrc = MIN (90, (attacker_dx * 4 + attacker_lv * 2) / 6);
    iERSrc = MIN (90, (victim_dx   * 4 + victim_lv   * 2) / 6);

    float fAR = ((float) iARSrc + 210.0f) / 300.0f;   // fAR = 0.7 ~ 1.0
    if (bIgnoreTargetRating)
    {
        return fAR;
    }

    float fER = ((float) (iERSrc * 2 + 5) / (iERSrc + 95)) * 3.0f / 10.0f;
    return fAR - fER;
}

AttackRating'in hesaplandığı fonksiyonda formülün hesaplanması için 4 tane bilgi lazım hepsi int olarak (neden mesela, bu da farklı bir soru 😅) tanımlanmış, buraya kadar her şey normal, son tanımlamada saldırıya uğrayan tarafın level bilgisini almak gerekiyor ama bilin bakalım kimin leveliyle hesaplama yapılıyor, saldırganın seviyesini kullanıyorsunuz. :ROFLMAO: Zaten doğal olarak mob_proto içerisinde level kısmı 1'den aşağıya ayarlı herhangi bir entity yok, 0 gelmesi riski yüzünden bunu yaptılar desem alakasız ve saçma olacak o yüzden bu şıkkı eledim, aklıma başka bir şeyde gelmedi. Bunu neden bu şekilde bıraktıklarını gerçekten merak ediyorum keşke sorma şansım olsaydı, ayrıca güncel olarak paylaşılan pek çok projeden de kontrol ettim kimsenin dikkatini çekmemiş, bu da enteresan geldi.

Eğer bir sebebi varsa demek ki bunu anlayacak kapasite bende yok çünkü gerçekten durup düşündüm ve bulamadım 😅, eğer yoksa bunca yıl hem kendilerinin hem de dosyaları kullanan bu kadar insanın fark etmemiş olma ihtimali inanılmaz bir olasılık, olması gerektiği gibi düzeltip deneyeceğim bir sıkıntı olursa -ki sanmıyorum- tekrar yorum yaparım.
 
İnanılmaz bir oyun, yıllarca dosyalarla uğraşsanız bile hala yeni şeyler (saçmalıklar demeye dilim varmadı) keşfedebiliyorsunuz, ufak bir yolculukla battle.cpp dosyasına bir yolculuk yapalım;

battle.cpp:
Genişlet Daralt Kopyala
float CalcAttackRating (LPCHARACTER pkAttacker, LPCHARACTER pkVictim, bool bIgnoreTargetRating)
{
    int iARSrc;
    int iERSrc;

    int attacker_dx = pkAttacker->GetPolymorphPoint (POINT_DX);
    int attacker_lv = pkAttacker->GetLevel();

    int victim_dx = pkVictim->GetPolymorphPoint (POINT_DX);
    int victim_lv = pkAttacker->GetLevel();

    iARSrc = MIN (90, (attacker_dx * 4 + attacker_lv * 2) / 6);
    iERSrc = MIN (90, (victim_dx   * 4 + victim_lv   * 2) / 6);

    float fAR = ((float) iARSrc + 210.0f) / 300.0f;   // fAR = 0.7 ~ 1.0
    if (bIgnoreTargetRating)
    {
        return fAR;
    }

    float fER = ((float) (iERSrc * 2 + 5) / (iERSrc + 95)) * 3.0f / 10.0f;
    return fAR - fER;
}

AttackRating'in hesaplandığı fonksiyonda formülün hesaplanması için 4 tane bilgi lazım hepsi int olarak (neden mesela, bu da farklı bir soru 😅) tanımlanmış, buraya kadar her şey normal, son tanımlamada saldırıya uğrayan tarafın level bilgisini almak gerekiyor ama bilin bakalım kimin leveliyle hesaplama yapılıyor, saldırganın seviyesini kullanıyorsunuz. :ROFLMAO: Zaten doğal olarak mob_proto içerisinde level kısmı 1'den aşağıya ayarlı herhangi bir entity yok, 0 gelmesi riski yüzünden bunu yaptılar desem alakasız ve saçma olacak o yüzden bu şıkkı eledim, aklıma başka bir şeyde gelmedi. Bunu neden bu şekilde bıraktıklarını gerçekten merak ediyorum keşke sorma şansım olsaydı, ayrıca güncel olarak paylaşılan pek çok projeden de kontrol ettim kimsenin dikkatini çekmemiş, bu da enteresan geldi.

Eğer bir sebebi varsa demek ki bunu anlayacak kapasite bende yok çünkü gerçekten durup düşündüm ve bulamadım 😅, eğer yoksa bunca yıl hem kendilerinin hem de dosyaları kullanan bu kadar insanın fark etmemiş olma ihtimali inanılmaz bir olasılık, olması gerektiği gibi düzeltip deneyeceğim bir sıkıntı olursa -ki sanmıyorum- tekrar yorum yaparım.

 
Üst