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:
Merhaba,

Bu yaşadığınız sorun, özellikle sisteme yeni kostüm türleri (COSTUME_WING, COSTUME_CAPE vb.) eklendiğinde sıkça karşılaşılan bir slot ve rendering (görselleştirme) çakışmasıdır. Sorununuz item_proto veya veritabanı ile ilgili değil, doğrudan client kaynak kodu (C++) ile ilgilidir.

Sorun Neden Kaynaklanıyor? (Basit Bir Örnekle anlatayım)


Bunu şöyle düşünün: Karakterinizin sırtında, özel efektler için ayrılmış sadece bir tane "Görünmez Askı" var.

* Siz bu askıya Kanatlarınızı (COSTUME_WING) taktınız ve harika görünüyor.
* Ancak sonra, Silah Efektini (COSTUME_ACCE) kuşanıyorsunuz. Sistem, bu ACCE türünü de aynı "Görünmez Askı"ya takmak üzere kodlanmış.
* Yeni bir şey takmak için askıyı boşaltması gerektiğinden, sistem önce Kanatları o askıdan kaldırıyor ve sonra yerine Silah Efektini takıyor. Sonuç: Kanatlarınız kayboluyor.
"Shining" olanların neden gitmediği ise şu: Shining sistemleri genellikle bu "Görünmez Askı"yı kullanmaz. Onlar, efekti doğrudan karakterin kemik yapısına veya tamamen farklı bir görsel katmana ekler. Bu da sorunun COSTUME_ACCE ve COSTUME_WING arasındaki slot çakışması olduğunu doğrular.

Çözüm Yolu: Client Kaynak Kodunu Düzenlemek

Bu sorunu kalıcı olarak çözmek için client taraflı C++ kaynak kodunuzda düzenleme yapmanız gerekmektedir kardeşim.

1- İlgili Dosyayı Bul: Çoğu zaman bu mantık UserInterface/PythonPlayer.cpp dosyası içerisinde yer alır.
2- İlgili Fonksiyonu Tespit Et: CPythonPlayer::SetItemData veya ekipman güncellendiğinde çağrılan benzer bir fonksiyonu bulun. Bu fonksiyonun içinde muhtemelen şöyle bir switch bloğu olacaktır:

[CODE title="C++"]switch (pItemData->GetSubType())
{
// ... diğer case'ler
case CItemData::COSTUME_ACCE:
// ACCE (Sasha, aura) sistemi ile ilgili kodlar
__AttachAcce(dwItemVnum, pItemData->GetSocket(0));
break;

case CItemData::COSTUME_WING:
// Yeni eklediğiniz KANAT sistemi ile ilgili kodlar
__AttachWing(dwItemVnum); // Fonksiyon adı farklı olabilir
break;
// ... diğer case'ler
}[/CODE]


3- Mantığı Düzeltin: Sorun şudur: case CItemData::COSTUME_ACCE: bloğunun içindeki __AttachAcce fonksiyonu veya benzeri bir işlem, muhtemelen kanatları (WING) veya diğer tüm kostüm efektlerini sıfırlayan bir kod içeriyordur.
Yapmanız gereken, bu iki sistemin birbirini etkilemeden, bağımsız olarak çalışmasını sağlamaktır.

__AttachAcce fonksiyonunun içeriğini kontrol edin. Başka efektleri (m_pWingEffect vb.) NULL yapan veya __DetachWing() gibi fonksiyonları çağıran satırlar var mı? Varsa bunları kaldırın.

ACCE ve WING için iki ayrı efekt pointer'ı (CInstanceBase::EffectInstance* m_pAcceEffect; ve CInstanceBase::EffectInstance* m_pWingEffect; gibi) olduğundan ve birini atarken diğerinin silinmediğinden emin olun.

Her iki case bloğunun da diğerinin verisini ezmediğinden emin olacak şekilde kod mantığını yeniden düzenleyin. Her biri kendi görselini eklemeli ve diğerine dokunmamalıdır bilmiyorum anlatabildim mi?

Alternatif (Daha Kolay) Çözüm de var onuda vereyim


Eğer C++ ile uğraşmak istemiyorsanız, bir diğer yol da silah efektinizin item_subtype'ını değiştirmektir. COSTUME_ACCE yerine, sistemde özel bir görselleştirme fonksiyonu tetiklemeyen daha "boş" bir subtype kullanabilirsiniz (örneğin COSTUME_HAIR veya COSTUME_BODY - eğer bu slotları başka bir şey için kullanmıyorsanız). Ancak bu, sorunu tam çözmek yerine etrafından dolaşmak olur.

Özetle: Bu, item_proto ile çözülebilecek bir sorun değildir. Kalıcı ve doğru çözüm için PythonPlayer.cpp dosyasını inceleyip, ACCE ve WING subtypelarının görselleştirme mantıklarının birbirini ezmediğinden emin olmanız gerekmektedir.

Umarım yardımcı olabilmişimdir. İyi çalışmalar.
 
Merhaba,

Bu yaşadığınız sorun, özellikle sisteme yeni kostüm türleri (COSTUME_WING, COSTUME_CAPE vb.) eklendiğinde sıkça karşılaşılan bir slot ve rendering (görselleştirme) çakışmasıdır. Sorununuz item_proto veya veritabanı ile ilgili değil, doğrudan client kaynak kodu (C++) ile ilgilidir.


Sorun Neden Kaynaklanıyor? (Basit Bir Örnekle anlatayım)


Bunu şöyle düşünün: Karakterinizin sırtında, özel efektler için ayrılmış sadece bir tane "Görünmez Askı" var.

* Siz bu askıya Kanatlarınızı (COSTUME_WING) taktınız ve harika görünüyor.
* Ancak sonra, Silah Efektini (COSTUME_ACCE) kuşanıyorsunuz. Sistem, bu ACCE türünü de aynı "Görünmez Askı"ya takmak üzere kodlanmış.
* Yeni bir şey takmak için askıyı boşaltması gerektiğinden, sistem önce Kanatları o askıdan kaldırıyor ve sonra yerine Silah Efektini takıyor. Sonuç: Kanatlarınız kayboluyor.
"Shining" olanların neden gitmediği ise şu: Shining sistemleri genellikle bu "Görünmez Askı"yı kullanmaz. Onlar, efekti doğrudan karakterin kemik yapısına veya tamamen farklı bir görsel katmana ekler. Bu da sorunun COSTUME_ACCE ve COSTUME_WING arasındaki slot çakışması olduğunu doğrular.


Çözüm Yolu: Client Kaynak Kodunu Düzenlemek

Bu sorunu kalıcı olarak çözmek için client taraflı C++ kaynak kodunuzda düzenleme yapmanız gerekmektedir kardeşim.

1- İlgili Dosyayı Bul: Çoğu zaman bu mantık UserInterface/PythonPlayer.cpp dosyası içerisinde yer alır.
2- İlgili Fonksiyonu Tespit Et: CPythonPlayer::SetItemData veya ekipman güncellendiğinde çağrılan benzer bir fonksiyonu bulun. Bu fonksiyonun içinde muhtemelen şöyle bir switch bloğu olacaktır:

[CODE title="C++"]switch (pItemData->GetSubType())
{
// ... diğer case'ler
case CItemData::COSTUME_ACCE:
// ACCE (Sasha, aura) sistemi ile ilgili kodlar
__AttachAcce(dwItemVnum, pItemData->GetSocket(0));
break;

case CItemData::COSTUME_WING:
// Yeni eklediğiniz KANAT sistemi ile ilgili kodlar
__AttachWing(dwItemVnum); // Fonksiyon adı farklı olabilir
break;
// ... diğer case'ler
}[/CODE]



3- Mantığı Düzeltin: Sorun şudur: case CItemData::COSTUME_ACCE: bloğunun içindeki __AttachAcce fonksiyonu veya benzeri bir işlem, muhtemelen kanatları (WING) veya diğer tüm kostüm efektlerini sıfırlayan bir kod içeriyordur.
Yapmanız gereken, bu iki sistemin birbirini etkilemeden, bağımsız olarak çalışmasını sağlamaktır.

__AttachAcce fonksiyonunun içeriğini kontrol edin. Başka efektleri (m_pWingEffect vb.) NULL yapan veya __DetachWing() gibi fonksiyonları çağıran satırlar var mı? Varsa bunları kaldırın.

ACCE ve WING için iki ayrı efekt pointer'ı (CInstanceBase::EffectInstance* m_pAcceEffect; ve CInstanceBase::EffectInstance* m_pWingEffect; gibi) olduğundan ve birini atarken diğerinin silinmediğinden emin olun.

Her iki case bloğunun da diğerinin verisini ezmediğinden emin olacak şekilde kod mantığını yeniden düzenleyin. Her biri kendi görselini eklemeli ve diğerine dokunmamalıdır bilmiyorum anlatabildim mi?


Alternatif (Daha Kolay) Çözüm de var onuda vereyim


Eğer C++ ile uğraşmak istemiyorsanız, bir diğer yol da silah efektinizin item_subtype'ını değiştirmektir. COSTUME_ACCE yerine, sistemde özel bir görselleştirme fonksiyonu tetiklemeyen daha "boş" bir subtype kullanabilirsiniz (örneğin COSTUME_HAIR veya COSTUME_BODY - eğer bu slotları başka bir şey için kullanmıyorsanız). Ancak bu, sorunu tam çözmek yerine etrafından dolaşmak olur.

Özetle: Bu, item_proto ile çözülebilecek bir sorun değildir. Kalıcı ve doğru çözüm için PythonPlayer.cpp dosyasını inceleyip, ACCE ve WING subtypelarının görselleştirme mantıklarının birbirini ezmediğinden emin olmanız gerekmektedir.

Umarım yardımcı olabilmişimdir. İyi çalışmalar.
öncelikle teşekkürler pythonplayer.cpp değilde __AttachAcce aratarak instancebase.cpp ve .h de buldum aradığımız kısım burası olabilir mi


[CODE title="instancebase.cpp"]#ifdef ENABLE_WINGS_NEW
if (pItem->GetSubType() == CItemData::COSTUME_WING)
{
__ClearWingShiningEffect();
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
if (pItem->GetIndex() == 16064)
{
__AttachAcceShiningEffect(i, shiningTable.szShinings, "Bip01");
}
else
{
__AttachWingShiningEffect(i, shiningTable.szShinings, "Bip01 Spine2");
}
}
#endif
#ifd#endifB#ifdefE_SYSTEM
else if (pItem->GetSubType() == CItemData::COSTUME_ACCE)
// if (pItem->GetSubType() == CItemData::COSTUME_ACCE)
{
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
{
if (pItem->GetIndex() >= 86066 && pItem->GetIndex() <= 86080)
{
__AttachAcceShiningEffect(i, shiningTable.szShinings, "Bip01 Spine2");
}
//if (strcmp(shiningTable.szShinings, ""))
else
{
__AttachAcceShiningEffect(i, shiningTable.szShinings, "Bip01");
}
}
}
#endif[/COD#endif
 
öncelikle teşekkürler pythonplayer.cpp değilde __AttachAcce aratarak instancebase.cpp ve .h de buldum aradığımız kısım burası olabilir mi


[CODE title="instancebase.cpp"]#ifdef ENABLE_WINGS_NEW
if (pItem->GetSubType() == CItemData::COSTUME_WING)
{
__ClearWingShiningEffect();
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
if (pItem->GetIndex() == 16064)
{
__AttachAcceShiningEffect(i, shiningTable.szShinings, "Bip01");
}
else
{
__AttachWingShiningEffect(i, shiningTable.szShinings, "Bip01 Spine2");
}
}
#endif
#ifd#endifB#ifdefE_SYSTEM
else if (pItem->GetSubType() == CItemData::COSTUME_ACCE)
// if (pItem->GetSubType() == CItemData::COSTUME_ACCE)
{
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
{
if (pItem->GetIndex() >= 86066 && pItem->GetIndex() <= 86080)
{
__AttachAcceShiningEffect(i, shiningTable.szShinings, "Bip01 Spine2");
}
//if (strcmp(shiningTable.szShinings, ""))
else
{
__AttachAcceShiningEffect(i, shiningTable.szShinings, "Bip01");
}
}
}
#endif[/COD#endif[/CODE]



Merhaba tekrar,

Paylaştığın kod parçası için teşekkürler. Evet, sorunun kalbi tam olarak orası. İlk cevabımda bahsettiğim "Görünmez Askı" çakışması, tam olarak bu kod bloğunda gerçekleşiyor.

Sorun Neden Bu Kodda?

Kodunu dikkatlice incelersek, mantıksal bir hata olduğunu göreceğiz. Hata şu:

[CODE title="C++"]#ifdef ENABLE_WINGS_NEW
if (pItem->GetSubType() == CItemData::COSTUME_WING)
{
// KANATLAR için kodlar...
}
#endif
else if (pItem#endifubType() == CItemData::COSTUME_ACCE)
{
// SİLAH EFEKTİ (ACCE) için kodlar...
}[/CODE]

Buradaki anahtar kelime else if.

Bu yapı, bilgisayara şunu söyler:"Eğer kuşanılan eşya bir KANAT ise, birinci bloğu çalıştır ve dur. Değilse, O ZAMAN kontrol et, eğer bir ACCE ise ikinci bloğu çalıştır."

Bu mantık yüzünden, sistem aynı anda hem kanadı hem de silah efektini işleyemiyor. Birini kuşanırken diğerinin görseli kayboluyor çünkü kod akışı birini seçmek zorunda kalıyor. Silah efektini (ACCE) taktığında, program if (COSTUME_WING) kontrolünü geçer, else if (COSTUME_ACCE) bloğuna girer ve sadece onu çalıştırır. Kanatlarla ilgili görsel yenileme kodu tamamen atlanmış olur.

Çözüm 1: Hızlı ve Etkili Düzeltme

Bu sorunu çözmenin en basit yolu, else if ifadesini basit bir if'e dönüştürmektir. Böylece iki kontrol birbirinden bağımsız hale gelir.

Hatalı Kod:
[CODE title="C++"]// ...
#ifdef ENABLE_WINGS_NEW
if (pItem->GetSubType() == CItemData::COSTUME_WING)
{
#ifdef/ ... Kanat kodları
}
#endif
else if (pItem->GetSubType() == CItemData::COSTUME#ifdef
{
// ... A#endifdları
}
#endif
// ...[/CODE]

Doğru kod:



[CODE title="C++"]// ...
#ifdef ENABLE_WINGS_NEW
if (#endif>GetSu#endif) == CItemData::COSTUME_WING)
{
##ifdefearWingShiningEffect();
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
##ifdefearWingShiningEffect(tIndex() == 16064)
{
__AttachAcceShining#ifdeflearWingShiningEffect(tIndex(], "Bip01");
}
else
{
__AttachWingShiningEffect(i, shiningTable.szShinings, "Bip01 Spine2");
}
}
#endif
#ifdef ENABLE_ACCE_SYSTEM
if (pItem->GetSubType() == CItemData::COSTUME_ACCE) // "else i##endif##ifdefce "if" kullanıldı
{
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
{
if (pItem->GetIndex() >= 86066 && pItem->GetIndex() <= 86080)
{
__AttachAcceShiningEffect(i, shiningTable.szShinings, "Bip01 Spine2");
}
else
{
__AttachAcceShiningEffect(i, shiningTable.szShinings, "Bip01");
}
}
}
#endif
// ...[/CODE]


Bu değişikliği yaptığında, sist##e#endifya kuş#endifğında ö#endifu bir kanat mı?" di#endiftrol edecek ve gereğini yapacak, sonra "Bu bir ACCE mi?" diye ayrıca kontrol edecek ve onun da gereğini yapacak. Böylece ikisi birbirinin görselini ezmeyecektir.

Çözüm 2: Daha Temiz ve Profesyonel Yaklaşım

Yukarıdaki çözüm işini görecektir. Ancak kodun daha temiz ve gelecekteki eklemelere daha uygun olmasını istiyorsan, ekipman takma/çıkarma fonksiyonlarını ayırmalısın.

Şu anki mantık, bir eşya takıldığında diğerlerini temizleyip yeniden yüklüyor gibi görünüyor. İdeali, her kostüm tipi için ayrı Attach (Tak) ve Detach (Çıkar) fonksiyonları olmasıdır.

Örneğin:

__AttachWing() ve __DetachWing()
__AttachAcce() ve __DetachAcce()

Böylece bir silah efekti (ACCE) taktığında sadece __AttachAcce() çağrılır ve kanatlarla ilgili hiçbir koda dokunulmaz. Bu daha büyük bir iştir ama en doğru yöntem budur.

Özetle: Kardeşim. else if'i if olarak değiştirmen, sorununu %99 ihtimalle çözecektir.

Umarım bu daha net bir yol haritası sunmuştur. İyi çalışmalar dilerim.
 
Son düzenleme:
Merhaba tekrar,

Paylaştığın kod parçası için teşekkürler. Evet, sorunun kalbi tam olarak orası. İlk cevabımda bahsettiğim "Görünmez Askı" çakışması, tam olarak bu kod bloğunda gerçekleşiyor.

Sorun Neden Bu Kodda?

Kodunu dikkatlice incelersek, mantıksal bir hata olduğunu göreceğiz. Hata şu:

[CODE title="C++"]#ifdef ENABLE_WINGS_NEW
if (pItem->GetSubType() == CItemData::COSTUME_WING)
{
// KANATLAR için kodlar...
}
#endif
else if (pItem#endifubType() == CItemData::COSTUME_ACCE)
{
// SİLAH EFEKTİ (ACCE) için kodlar...
}[/CODE]

Buradaki anahtar kelime else if.

Bu yapı, bilgisayara şunu söyler:"Eğer kuşanılan eşya bir KANAT ise, birinci bloğu çalıştır ve dur. Değilse, O ZAMAN kontrol et, eğer bir ACCE ise ikinci bloğu çalıştır."

Bu mantık yüzünden, sistem aynı anda hem kanadı hem de silah efektini işleyemiyor. Birini kuşanırken diğerinin görseli kayboluyor çünkü kod akışı birini seçmek zorunda kalıyor. Silah efektini (ACCE) taktığında, program if (COSTUME_WING) kontrolünü geçer, else if (COSTUME_ACCE) bloğuna girer ve sadece onu çalıştırır. Kanatlarla ilgili görsel yenileme kodu tamamen atlanmış olur.

Çözüm 1: Hızlı ve Etkili Düzeltme

Bu sorunu çözmenin en basit yolu, else if ifadesini basit bir if'e dönüştürmektir. Böylece iki kontrol birbirinden bağımsız hale gelir.

Hatalı Kod:
[CODE title="C++"]// ...
#ifdef ENABLE_WINGS_NEW
if (pItem->GetSubType() == CItemData::COSTUME_WING)
{
#ifdef/ ... Kanat kodları
}
#endif
else if (pItem->GetSubType() == CItemData::COSTUME#ifdef
{
// ... A#endifdları
}
#endif
// ...[/CODE]

Doğru kod:



[CODE title="C++"]// ...
#ifdef ENABLE_WINGS_NEW
if (#endif>GetSu#endif) == CItemData::COSTUME_WING)
{
##ifdefearWingShiningEffect();
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
##ifdefearWingShiningEffect(tIndex() == 16064)
{
__AttachAcceShining#ifdeflearWingShiningEffect(tIndex(], "Bip01");
}
else
{
__AttachWingShiningEffect(i, shiningTable.szShinings, "Bip01 Spine2");
}
}
#endif
#ifdef ENABLE_ACCE_SYSTEM
if (pItem->GetSubType() == CItemData::COSTUME_ACCE) // "else i##endif##ifdefce "if" kullanıldı
{
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
{
if (pItem->GetIndex() >= 86066 && pItem->GetIndex() <= 86080)
{
__AttachAcceShiningEffect(i, shiningTable.szShinings, "Bip01 Spine2");
}
else
{
__AttachAcceShiningEffect(i, shiningTable.szShinings, "Bip01");
}
}
}
#endif
// ...[/CODE]


Bu değişikliği yaptığında, sist##e#endifya kuş#endifğında ö#endifu bir kanat mı?" di#endiftrol edecek ve gereğini yapacak, sonra "Bu bir ACCE mi?" diye ayrıca kontrol edecek ve onun da gereğini yapacak. Böylece ikisi birbirinin görselini ezmeyecektir.

Çözüm 2: Daha Temiz ve Profesyonel Yaklaşım

Yukarıdaki çözüm işini görecektir. Ancak kodun daha temiz ve gelecekteki eklemelere daha uygun olmasını istiyorsan, ekipman takma/çıkarma fonksiyonlarını ayırmalısın.

Şu anki mantık, bir eşya takıldığında diğerlerini temizleyip yeniden yüklüyor gibi görünüyor. İdeali, her kostüm tipi için ayrı Attach (Tak) ve Detach (Çıkar) fonksiyonları olmasıdır.

Örneğin:

__AttachWing() ve __DetachWing()
__AttachAcce() ve __DetachAcce()

Böylece bir silah efekti (ACCE) taktığında sadece __AttachAcce() çağrılır ve kanatlarla ilgili hiçbir koda dokunulmaz. Bu daha büyük bir iştir ama en doğru yöntem budur.

Özetle: Kardeşim. else if'i if olarak değiştirmen, sorununu %99 ihtimalle çözecektir.

Umarım bu daha net bir yol haritası sunmuştur. İyi çalışmalar dilerim.


teşekkürler fakat attığınız şekilde build almıyor
 

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

Geri
Üst