Çözüldü Görünmezlikten çıkınca GM efekti geri gelmiyor.

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ı.

leqions

Üye
Üye
Mesaj
74
Çözümler
4
Beğeni
88
Puan
669
Ticaret Puanı
0
Herkese merhaba arkadaşlar. Çoğu filesta olan bu sorunu / eksiği çözmeye çalışıyorum. Görsellik dışında hiçbir eksisi yok ama /inv'den geri çıkınca GM logosunun tekrar görünür olması için ışınlanmamın veya ölmemin gerekmesi bende takıntı oluşturdu.

Günler önce, şu an forumdaki "67 adet fix" konusunda da bulunan client taraflı bir ayar yaptım, çözdüğümü zannedip o şekilde bıraktım. Mantık olarak çalışıyor fakat az evvel fark ettim ki bu sefer görünmez olan GM karakter, diğer karakterlerin görüş alanından çıkıp geri geldiğinde (veya diğer karakterler uzaklaşıp döndüğünde) görünmez olmasına rağmen karakterler onu uçan bir GM logosu olarak görüyor. Görünmezliğin bir anlamı kalmıyor kısacası.

Bu paragrafta denediğim çözüm:
client src / InstanceBaseEffect.cpp:
            if (isVisible)
            {
                m_GraphicThingInstance.HideAllAttachingEffect();
                __EffectContainer_Destroy();
                DetachTextTail();
            }
            else
            {
                m_GraphicThingInstance.BlendAlphaValue(1.0f, 1.0f);
                m_GraphicThingInstance.ShowAllAttachingEffect();
                AttachTextTail();
                RefreshTextTail();
            }


Daha sonra bu ufak bölümü orijinal haline geri döndürüp, server tarafında bir şeylerle oynamayı denedim. "Madem ölüp yeniden doğunca veya ışınlanınca logo geri geliyor, ben de restart here kodlarından bi şeyler araklayayım, nasılsa ışınlamıyor." diyip cmd_gm.cpp'de şöyle bir deneme yaptım: ("//test" satırlarının arasındaki bölüm)

game src / cmd_gm.cpp:
ACMD(do_invisibility)
{
    if (ch->IsAffectFlag(AFF_INVISIBILITY))
    {
        ch->RemoveAffect(AFFECT_INVISIBILITY);
        //test
        if (ch->IsGM())
        {
            ch->StartRecoveryEvent();
            ch->SetPosition(POS_STANDING);
            ch->RestartAtSamePos();
            ch->ReviveInvisible(1);//lüzumu yok
        }
        //test bitis
    }
    else
    {
        ch->AddAffect(AFFECT_INVISIBILITY, POINT_NONE, 0, AFF_INVISIBILITY, INFINITE_AFFECT_DURATION, 0, true);
    }
}

Bu aşağı yukarı istediğim şeyi verdi ama bu kez de görünmezlikten çıkan GM karakterin sadece diğer client'lerde 1 saniye kadar görünüp kaybolan hareketsiz hayalet bir kopyası oluşuyor. Ölmeyen adamı aynı yerde yeniden doğurunca şaşırıyor herhalde garibim. Haliyle bu da bana görsel bir rahatsızlık veriyor.

Kırmızı kutu içine aldığım eleman, hayalet kopya (tam kaybolurken ss alabildim) :
IMG-20240413-WA0009.jpg


Saçma bir görsel oluşuyor, böyle de kullanılmaz.
Başka bir çözüm yolu bilen var mıdır? Yardımlarınızı bekliyorum şimdiden teşekkürler.
 
Çözüm
Evet sonunda saçma sapan bir yöntemle de olsa, logonun geri gelmemesini de, karakterin kısa süren klonlanmasını da çözmeyi başardım arkadaşlar.
cmd_gm.cpp:
ACMD(do_invisibility)
{
    if (ch->IsAffectFlag(AFF_INVISIBILITY))
    {
        //ch->RemoveAffect(AFFECT_INVISIBILITY);
        ch->SetPolymorph(9, false); //önce var olmayan bir vnum'a dönüştür ki görünmezliği kaldırınca 2 saniye görünüp kaybolan kopya bu tanımsız/görünmez "modele" sahip olsun. (yani görünmesin.)
        ch->RemoveAffect(AFFECT_INVISIBILITY); //sonra görünmezlik efektinin kendisini kaldır.
        ch->SetPolymorph(0, false); //son olarak orijinal karakterine geri döndür.
    }
    else
    {
        ch->AddAffect(AFFECT_INVISIBILITY, POINT_NONE, 0, AFF_INVISIBILITY...
C++:
    if (ch->IsAffectFlag(AFF_INVISIBILITY))
    {
        ch->RemoveAffect(AFFECT_INVISIBILITY);
        if (ch->IsGM())
        {
            ch->RefreshAffect();
            ch->UpdatePacket();
        }
    }

Yaptığınız tüm değişiklikleri orijinal haline çevirip ilgili kısmı bir de verdiğim şekilde dener misiniz, sonucu bende merak ettim.
 
C++:
    if (ch->IsAffectFlag(AFF_INVISIBILITY))
    {
        ch->RemoveAffect(AFFECT_INVISIBILITY);
        if (ch->IsGM())
        {
            ch->RefreshAffect();
            ch->UpdatePacket();
        }
    }

Yaptığınız tüm değişiklikleri orijinal haline çevirip ilgili kısmı bir de verdiğim şekilde dener misiniz, sonucu bende merak ettim.
maalesef, yine görünmezlikten çıkınca gm efekti gelmiyor.
 
Server Source/game/src/char.h

Arat

C++:
bool ChangeSex();

Altına ekle

C++:
bool do_invisibility();

Server Source/game/src/char.cpp

Ara

C++:
WORD CHARACTER::GetRaceNum() const

Altına ekle

C++:
bool CHARACTER::do_invisibility()
{
UpdatePacket();
SET_BIT(m_bAddChrState, ADD_CHARACTER_STATE_SPAWN);
m_afAffectFlag.Set(AFF_SPAWN);
ViewReencode();
REMOVE_BIT(m_bAddChrState, ADD_CHARACTER_STATE_SPAWN);
m_afAffectFlag.Reset(AFF_SPAWN);
}

Server Source/game/src/cmd_gm.cpp

Ara

C++:
ACMD(do_invisibility)

Kod blogunu değiştir

C++:
ACMD(do_invisibility)
{
if (ch->IsAffectFlag(AFF_INVISIBILITY))
{
ch->RemoveAffect(AFFECT_INVISIBILITY);
}
else
{
ch->AddAffect(AFFECT_INVISIBILITY, POINT_NONE, 0, AFF_INVISIBILITY, INFINITE_AFFECT_DURATION, 0, true);
}
ch->do_invisibility();
}

Dipnot : alıntı.
 
Son düzenleme:
Server Source/game/src/char.h

Arat

C++:
bool ChangeSex();

Altına ekle

C++:
bool do_invisibility();

Server Source/game/src/char.cpp

Ara

C++:
WORD CHARACTER::GetRaceNum() const

Altına ekle

C++:
bool CHARACTER::do_invisibility()
{
UpdatePacket();
SET_BIT(m_bAddChrState, ADD_CHARACTER_STATE_SPAWN);
m_afAffectFlag.Set(AFF_SPAWN);
ViewReencode();
REMOVE_BIT(m_bAddChrState, ADD_CHARACTER_STATE_SPAWN);
m_afAffectFlag.Reset(AFF_SPAWN);
}

Server Source/game/src/cmd_gm.cpp

Ara

C++:
ACMD(do_invisibility)

Kod blogunu değiştir

C++:
ACMD(do_invisibility)
{
if (ch->IsAffectFlag(AFF_INVISIBILITY))
{
ch->RemoveAffect(AFFECT_INVISIBILITY);
}
else
{
ch->AddAffect(AFFECT_INVISIBILITY, POINT_NONE, 0, AFF_INVISIBILITY, INFINITE_AFFECT_DURATION, 0, true);
}
ch->do_invisibility();
}

Dipnot : alıntı.
bu şekilde muhtemelen işini görmez arkadaşın.
 
Server Source/game/src/char.h

Arat

C++:
bool ChangeSex();

Altına ekle

C++:
bool do_invisibility();

Server Source/game/src/char.cpp

Ara

C++:
WORD CHARACTER::GetRaceNum() const

Altına ekle

C++:
bool CHARACTER::do_invisibility()
{
UpdatePacket();
SET_BIT(m_bAddChrState, ADD_CHARACTER_STATE_SPAWN);
m_afAffectFlag.Set(AFF_SPAWN);
ViewReencode();
REMOVE_BIT(m_bAddChrState, ADD_CHARACTER_STATE_SPAWN);
m_afAffectFlag.Reset(AFF_SPAWN);
}

Server Source/game/src/cmd_gm.cpp

Ara

C++:
ACMD(do_invisibility)

Kod blogunu değiştir

C++:
ACMD(do_invisibility)
{
if (ch->IsAffectFlag(AFF_INVISIBILITY))
{
ch->RemoveAffect(AFFECT_INVISIBILITY);
}
else
{
ch->AddAffect(AFFECT_INVISIBILITY, POINT_NONE, 0, AFF_INVISIBILITY, INFINITE_AFFECT_DURATION, 0, true);
}
ch->do_invisibility();
}

Dipnot : alıntı.
Teşekkürler. Denedim, bu da güzel fakat bunda da aynı şekilde ilk postta paylaştığım ss'teki gibi diğer clientler için kısa süre görünüp kaybolan bir hayalet kopyamız oluşuyor :(
(bool do_invisibility() -> true ya da false bir değer döndürmediği için "void" olarak kullandım.)
 
maalesef, yine görünmezlikten çıkınca gm efekti gelmiyor.
İlginç, görünmez moda girerken AFF_YMIR affectini silip çıkarken tekrar ekleyip refreshlesek nasıl olur acaba diye düşündüm ama bilemedim, pek bir fark olmayacak gibi ama denenedebilir, kararsız kaldım açıkçası. Game src tarafından çözebileceğimizi düşünüyorum ama yöntem tartışılır.
 
Evet sonunda saçma sapan bir yöntemle de olsa, logonun geri gelmemesini de, karakterin kısa süren klonlanmasını da çözmeyi başardım arkadaşlar.
cmd_gm.cpp:
ACMD(do_invisibility)
{
    if (ch->IsAffectFlag(AFF_INVISIBILITY))
    {
        //ch->RemoveAffect(AFFECT_INVISIBILITY);
        ch->SetPolymorph(9, false); //önce var olmayan bir vnum'a dönüştür ki görünmezliği kaldırınca 2 saniye görünüp kaybolan kopya bu tanımsız/görünmez "modele" sahip olsun. (yani görünmesin.)
        ch->RemoveAffect(AFFECT_INVISIBILITY); //sonra görünmezlik efektinin kendisini kaldır.
        ch->SetPolymorph(0, false); //son olarak orijinal karakterine geri döndür.
    }
    else
    {
        ch->AddAffect(AFFECT_INVISIBILITY, POINT_NONE, 0, AFF_INVISIBILITY, INFINITE_AFFECT_DURATION, 0, true);
    }
}

Not: var olmayan modele dönüşülen yaklaşık 0.3 saniyelik zaman diliminde doğal olarak hareket edemiyoruz, fakat benim için bu karakterin kopyalanmasından daha önemsiz, ufacık bir detay. o yüzden bununla daha fazla kafayı yiyemeyeceğim :D


Güncelleme:
En temiz çözüm -en azından benim için- aşağıda yazacağım kod. Her şey olağan akışında görünüyor:

cmd_gm.cpp:
ACMD(do_invisibility)
{
    if (ch->IsAffectFlag(AFF_INVISIBILITY))
    {
        ch->RemoveAffect(AFFECT_INVISIBILITY);
        ch->AddAffect(AFFECT_REVIVE_INVISIBLE, POINT_NONE, 0, AFF_REVIVE_INVISIBLE, 0.2, 0, true);
        ch->RemoveAffect(AFFECT_REVIVE_INVISIBLE); //bu iki revive_invisible satırının görünürde işlevi yok fakat "klon" dediğim şeyin çok doğal şekilde yarı transparan görünüp milisaniyeler içinde fade out ile kaybolmasını sağlıyor (normal dönüşümlerdeki gibi).
        ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY(), ch->GetZ()); //direkt self teleport
        ch->Stop();
    }
else
//.... geri kalan kısımda değişiklik yok
 
Son düzenleme:
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst