Çözüldü Client Build Error C2664

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

Kaiser

Admin
Admin
Geliştirici
Yardımsever Üye
Mesaj
3.970
Çözümler
384
Beğeni
4.037
Puan
1.849
Ticaret Puanı
0
Merhabalar, evrim sistemiyle ilgili şu sorunu, tanımları ne kadar kontrol etsem de çözemedim. Ufak bir detayı gözden kaçırıyorum sanırım fakat bulamadım bir türlü.

Adsız.jpg


Visual Studio'nun bildirim olarak gösterdiği yer ise şurası;

PythonTextTail.h:
Genişlet Daralt Kopyala
#ifdef ENABLE_WEAPON_EVOLUTION_SYSTEM
        void RegisterItemTextTail(DWORD VirtualID, const char* c_szText, CGraphicObjectInstance* pOwner, char* evolutionMergeText = false);
#else
        void RegisterItemTextTail(DWORD VirtualID, const char* c_szText, CGraphicObjectInstance* pOwner);
#endif

PythonTexTatil.cpp dosyasındaki ilgili fonksiyon başlığı ise;
PythonTextTail.cpp:
Genişlet Daralt Kopyala
#ifdef ENABLE_WEAPON_EVOLUTION_SYSTEM
void CPythonTextTail::RegisterItemTextTail(DWORD VirtualID, const char* c_szText, CGraphicObjectInstance* pOwner, char * evolutionMergeText)
#else
void CPythonTextTail::RegisterItemTextTail(DWORD VirtualID, const char* c_szText, CGraphicObjectInstance* pOwner)
#endif
 
Çözüm
Sorunu çözdüm sonunda. Gözümüzün önündeki şeyi görmemişiz resmen.

C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_WEAPON_EVOLUTION_SYSTEM
    char evolutionMergeText[256]; char evolutionText[6][10] = { "", "Yaygın ", "Seyrek ", "Nadir ", "Efsane ", "Eşsiz " };
    snprintf(evolutionMergeText, sizeof(evolutionMergeText), "%s%s", evolutionText[evolution], pItemData->GetName());

#endif
    rkTextTail.RegisterItemTextTail(
        dwVirtualID,
#ifdef ENABLE_WEAPON_EVOLUTION_SYSTEM
        evolutionMergeText,
#endif
        //pItemData->GetName(),
        &pGroundItemInstance->ThingInstance);

Bu kodun üst kısmında (evolutionMergeText) zaten pItemData->GetName(); çağrısı yapılmış. Ayrıca bir de altta çağırdığımızda dolayısıyla uyumsuzluk yapıyor.
Bu yüzden alttaki...
Yere düştüğünde görünmesini sağlamak için seçtiğin silah evrimlerini item olarak tanımlatsana. Zehir kılıcının satırını kopyala ve yeni vnum atayıp örnek Seyrek Zehir Kılıcı yap. Yoksa bu tabii ki sadece silah isminde görünen bir ek. O yüzden envanterde ve yansıtırken görünmesi gayet normal. İtemi attığında normal olarak Zehir Kılıcı yazacak çünkü hangi slottan kaç vnum sahip eşyayı attığına bakıp yere o itemi ona göre atmıyor mu?

Örnek; 0. slotta Zehir Kılıcın var. Buna evrim attın ve Seyrek Zehir Kılıcı oldu. Buraya kadar sorun yok. Envanterde, yansıtırken, alışverişte vb görünüyor. Yalnız yere atarken 0. slotta ki Seyrek Zehir Kılıcını atıyorsun ama yere atmayı onayladıktan sonra gidip 189 numaralı itemi atıyor. 189 numaralı item bilgilerini alıp. Sonuç olarak yere Zehir Kılıcı olarak düşüyor çünkü Seyrek Zehir Kılıcı ismine ait bir vnum yok ve evrim sadece ismin yanına ek olarak eklendiğinden aslında o sadece Zehir Kılıcı.

Yani senin hata olarak gördüğün şey aslında bir hata değil ve olması gerektiği gibi çalışıyor. O yüzden evrim ismini yanına ek olarak değil de direk item vnum değerini değiştirip, o vnum değerine göre bilgileri çekerse dediğin olur. Senin kodlarla oynamana bile gerek yoktu. Sadece yeni item eklemen gerekli.

Daha başka şekilde örnek verirsem. Cheat Engine'yi açıp oyunda ki Zehir Kılıcının ismini Seyrek Zehir Kılıcı yapsam envanterde ve yansıtırken vb Seyrek Zehir Kılıcı olarak görünecek. Yalnız aslında o bir Seyrek Zehir Kılıcı değil, sadece Zehir Kılıcı. Onu yere attığımda sunucudan Zehir Kılıcı vnum değerine bakıp ona göre yere atacak. Sonuç olarak yerde Zehir Kılıcı görünecek, Seyrek Zehir Kılıcı değil.

Umarım istediğin şeyi nasıl yapacağını anlamışsındır.
 
Yere düştüğünde görünmesini sağlamak için seçtiğin silah evrimlerini item olarak tanımlatsana. Zehir kılıcının satırını kopyala ve yeni vnum atayıp örnek Seyrek Zehir Kılıcı yap. Yoksa bu tabii ki sadece silah isminde görünen bir ek. O yüzden envanterde ve yansıtırken görünmesi gayet normal. İtemi attığında normal olarak Zehir Kılıcı yazacak çünkü hangi slottan kaç vnum sahip eşyayı attığına bakıp yere o itemi ona göre atmıyor mu?

Örnek; 0. slotta Zehir Kılıcın var. Buna evrim attın ve Seyrek Zehir Kılıcı oldu. Buraya kadar sorun yok. Envanterde, yansıtırken, alışverişte vb görünüyor. Yalnız yere atarken 0. slotta ki Seyrek Zehir Kılıcını atıyorsun ama yere atmayı onayladıktan sonra gidip 189 numaralı itemi atıyor. 189 numaralı item bilgilerini alıp. Sonuç olarak yere Zehir Kılıcı olarak düşüyor çünkü Seyrek Zehir Kılıcı ismine ait bir vnum yok ve evrim sadece ismin yanına ek olarak eklendiğinden aslında o sadece Zehir Kılıcı.

Yani senin hata olarak gördüğün şey aslında bir hata değil ve olması gerektiği gibi çalışıyor. O yüzden evrim ismini yanına ek olarak değil de direk item vnum değerini değiştirip, o vnum değerine göre bilgileri çekerse dediğin olur. Senin kodlarla oynama bile gerek yoktu. Sadece yeni item eklemen gerekli.

Daha başka şekilde örnek verirsem. Cheat Engine'yi açıp oyunda ki Zehir Kılıcının ismini Seyrek Zehir Kılıcı yapsam envanterde ve yansıtırken vb Seyrek Zehir Kılıcı olarak görünecek. Yalnız aslında o bir Seyrek Zehir Kılıcı değil, sadece Zehir Kılıcı. Onu yere attığımda sunucudan Zehir Kılıcı vnum değerine bakıp ona göre yere atacak. Sonuç olarak yerde Zehir Kılıcı görünecek, Seyrek Zehir Kılıcı değil.

Umarım istediğin şeyi nasıl yapacağını anlamışsındır.
Sadece item isminin önüne bir ek getirmiyor. Mesela yansıtılan bir zehir eğer evrimliyse yukarıda da gösterdiğim gibi Seyrek Zehir Kılıcı olarak görünüyor ve buna ek olarak üzerine tıkladığında normal zehir kılıcını değil, evrimli halini (ekstra güçlü) olan zehiri gösteriyor. Yani sadece evrim ismini değil, attr leri de çekiyor aynı zamanda. 189 numaralı itemin özelliklerini değil, evrimleşmiş halinin özelliklerini çekiyor.
Ayrıca her bir evrim seviyesini yeni bir vnum olarak tanımlamak evrim sistemini baştan sona değiştirmek gibi bir şey olacak. Şu an ki hali ile tek bir item üzerine giydirme yapıyor, yani herhangi bir dönüşüm olayı yok. Diğer türlü her bir seviye için ayrı ayrı dönüşüm yapılmış olacak, ki bunu yaparsam zaten evrim sisteminin bir anlamı kalmıyor, sıradan bir silah dönüşümü yaptırmış olacağım..

Benim şu an tek sorunum itemin ismi. Yere atılıp tekrar yerden aldıktan sonra evrimde yada özelliklerde herhangi bir değişim olmuyor, sadece isminin önüne evrim seviyesini dahil ettirmem gerek. Nadir,Seyrek,Efsanevi vs.. Bir önceki mesajımda da ayrı bir vnum tanımı yapmadan sorunu çözdüm, bunun da bir yolu olması gerek illaki..
 
Peki MySQL'da envanterinde ki Seyrek Zehir Kılıcı ne olarak geçiyor? Zehir Kılıcı olarak değil mi?
Evet Zehir Kılıcı olarak geçiyor. Zaten olması gereken de bu. Çünkü evrim sistemlerinin neredeyse hiç birinde mysql ile pek iş olmuyor ve yeni bir item tanımlama olayı falan olmuyor. Var olan itemin üstüne giydirme yapıyor ve silahın her yerde evrimli görünmesi için de gerekli uyarlamalar mevcut. Mesela ticaret camında da evrimsiz düz bir zehir olarak gösteriyordu, ya da pazar kurarken evrimi bozuyordu orjinale çeviriyordu. Bu gibi durumları çözdüm ve şu an bu yaşadığım sorun hariç her yerde silah eğer evrimliyse evrimli bir şekilde görünüyor sorunsuz olarak.
 
Evet Zehir Kılıcı olarak geçiyor. Zaten olması gereken de bu. Çünkü evrim sistemlerinin neredeyse hiç birinde mysql ile pek iş olmuyor ve yeni bir item tanımlama olayı falan olmuyor. Var olan itemin üstüne giydirme yapıyor ve silahın her yerde evrimli görünmesi için de gerekli uyarlamalar mevcut. Mesela ticaret camında da evrimsiz düz bir zehir olarak gösteriyordu, ya da pazar kurarken evrimi bozuyordu orjinale çeviriyordu. Bu gibi durumları çözdüm ve şu an bu yaşadığım sorun hariç her yerde silah eğer evrimliyse evrimli bir şekilde görünüyor sorunsuz olarak.

Peki, altta ki yere bir ekleme yaptın mı?

char_item.cpp:
Genişlet Daralt Kopyala
if (pkItemToDrop->AddToGround(GetMapIndex(), pxPos))
{
...
}
 
Sorunu çözdüm sonunda. Gözümüzün önündeki şeyi görmemişiz resmen.

C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_WEAPON_EVOLUTION_SYSTEM
    char evolutionMergeText[256]; char evolutionText[6][10] = { "", "Yaygın ", "Seyrek ", "Nadir ", "Efsane ", "Eşsiz " };
    snprintf(evolutionMergeText, sizeof(evolutionMergeText), "%s%s", evolutionText[evolution], pItemData->GetName());

#endif
    rkTextTail.RegisterItemTextTail(
        dwVirtualID,
#ifdef ENABLE_WEAPON_EVOLUTION_SYSTEM
        evolutionMergeText,
#endif
        //pItemData->GetName(),
        &pGroundItemInstance->ThingInstance);

Bu kodun üst kısmında (evolutionMergeText) zaten pItemData->GetName(); çağrısı yapılmış. Ayrıca bir de altta çağırdığımızda dolayısıyla uyumsuzluk yapıyor.
Bu yüzden alttaki pItemData->GetName() çağrısını pasif hale getirdim ve evolutionMergeText'i tanımladım sadece. Tek başına (eğer varsa)hem evrimi, hem de item ismini çağırıyor.

Sonrasında da bu sefer yerdeki evrimli zehir kılıcını aldığımda, düz bir şekilde Zehir Kılıcı +9 Kazandın. yazıyordu.
Onu da aynı mantıkla char_item.cpp den şu şekilde hallettim;
C++:
Genişlet Daralt Kopyala
char evolutionMergeText[256];
char evolutionText[6][10] = { "", "Yaygın ", "Seyrek ", "Nadir ", "Efsane ", "Eşsiz " };
snprintf(evolutionMergeText, sizeof(evolutionMergeText), "%s%s", evolutionText[item->GetEvolution()], item->GetName());
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), evolutionMergeText/*, item->GetName()*/);

ve sonuç;

Adsız.jpg


Yardımcı olmaya çalışan ve ilgilenen herkese teşekkür ederim.
 
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Üst