Çözüldü Hızlı çıkış sistemi hatası

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

MEKA

Discord: mekaprojects
Süper Moderatör
Premium Üye
Grafiker
Geliştirici
Yardımsever Üye
Editör
Mesaj
2.746
Çözümler
286
Beğeni
1.989
Puan
1.349
Düelloda iken çıkış yapmaması lazım fakat direk kapatıyor oyunu
Python:
    def __ClickExitButton(self):
        import uiCommon
        questionDialog = uiCommon.QuestionDialog()
        questionDialog.SetText("Oyunu kapatmak istiyor musun?")
        questionDialog.SetAcceptEvent(ui.__mem_func__(self.Yes))
        questionDialog.SetCancelEvent(ui.__mem_func__(self.Hayir))
        questionDialog.Open()
        self.questionDialog = questionDialog

    def Yes(self):
        import player
        if player.IsPVPInstance():
            import chat
            chat.AppendChat(chat.CHAT_TYPE_INFO, "Duello'da iken oyunu kapatamassiniz.")
        else:
            import app
            app.Exit()

    def Hayir(self):
        self.Close()
        self.questionDialog.Close()
 
Çözüm
Ekran görüntüsünü paylaştığınız için teşekkür ederim.
player.IsPVPInstance fonksiyonunu daha detaylı inceledikten sonra @Trashy 'nin bilgisayarına bağlanıp beraber ufak bir düzenleme yaparak sistemi çalıştırmayı başardık. Bende bu aşamada bilmediğim bir fonksiyonu daha detaylıca öğrenme fırsatına sahip oldum. Bu yüzden böyle bir soru sorduğunuz için teşekkürler.

Bu düzenlemeyi uygulayacaklar için ufak bir bilgi;
Bu sistem %100 karşıda ki kişinin wsden kaçmasına engel olmuyor. Görev yöneticisinden istemciyi kapatabilir veya interneti kapatabilir.
Bir diğer hususta en son düello gönderilen karakterle kontrol yapılır.
Gene de bu sorunu yaşayan varsa çözmek için şu adımı uygulasın.

Not: Detaylıca test edilmediği için...
Python kodlarında bir sıkıntı yok. Belki player.IsPVPInstance() fonksiyonu düzgün çalışmıyordur.
 
Bu fonksiyon varsayılan Metin2'de bulunuyormuş. Bende sistemle ekli sandım. :) Pvp yaptığınız kişiye vurarak bi hızlı çıkış yapmayı deneyin bakalım çalışacak mı..
 
Bu fonksiyon varsayılan Metin2'de bulunuyormuş. Bende sistemle ekli sandım. :) Pvp yaptığınız kişiye vurarak bi hızlı çıkış yapmayı deneyin bakalım çalışacak mı..
Her türlü oyunu kapatıyor fonksiyonda problem var sanırım dediğiniz gibi nasıl çözebiliriz
 
Karakteri serbest moda aldıktan sonra tekrar deneyebilir misiniz?
 
Normalde bir oyuncu ile düello yaparken veya serbest modda bu fonksiyon true vermesi lazım.

Sorunu şimdi fark ettim. Gösterdiğiniz kodda fonksiyona arg verilmemiş.
player.IsPVPInstance’ye karakterinizin vid değerini göndermeniz gerekiyor.
 
Normalde bir oyuncu ile düello yaparken veya serbest modda bu fonksiyon true vermesi lazım.

Sorunu şimdi fark ettim. Gösterdiğiniz kodda fonksiyona arg verilmemiş.
player.IsPVPInstance’ye karakterinizin vid değerini göndermeniz gerekiyor.
nasıl yapacağım hakkında ufak bir bilgi :D
 
C++:
PyObject * playerIsPVPInstance(PyObject* poSelf, PyObject* poArgs)
{
    int iVID;
    if (!PyTuple_GetInteger(poArgs, 0, &iVID))
        return Py_BuildException();

    CInstanceBase * pMainInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr();
    CInstanceBase * pTargetInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVID);
    if (!pMainInstance)
        return Py_BuildValue("i", 0);
    if (!pTargetInstance)
        return Py_BuildValue("i", 0);

    return Py_BuildValue("i", pMainInstance->IsPVPInstance(*pTargetInstance));
}

player.IsPVPIstance() fonksiyonun kodları bu. Kodda arg gönderilmediği için diğer işlemleri yapmıyor. Yani sürekli false döndürüyor. Biz de oyuna giriş yaptığımız karakterin vid değerini göndermemiz gerekiyor.

Kendi karakterimizin vid değerini veren python fonksiyonu ise şu;
player.GetMainCharacterIndex()

Şimdi şu şekilde sistemde ki kodu düzeltebiliriz.
Python:
    def __ClickExitButton(self):
        import uiCommon
        questionDialog = uiCommon.QuestionDialog()
        questionDialog.SetText("Oyunu kapatmak istiyor musun?")
        questionDialog.SetAcceptEvent(ui.__mem_func__(self.Yes))
        questionDialog.SetCancelEvent(ui.__mem_func__(self.Hayir))
        questionDialog.Open()
        self.questionDialog = questionDialog
    def Yes(self):
        import player
        if player.IsPVPInstance(player.GetMainCharacterIndex()):
            import chat
            chat.AppendChat(chat.CHAT_TYPE_INFO, "Duello'da iken oyunu kapatamassiniz.")
        else:
            import app
            app.Exit()
    def Hayir(self):
        self.Close()
        self.questionDialog.Close()


Bir de oyuncu çıkamazsa bile istemciyi görev yöneticisi ile sonlandırabilir, internet bağlantısını koparabilir. Kesin olarak savaş sırasında çıkmasını engelleyemezsiniz.

Birde ufak bir tavsiye. Bu tarz işlemlerde belirtilen fonksiyonun olduğu gibi çalışmadığını düşünüyorsanız hemen client kaynak kodlarından o fonksiyonun kodlarını okuyun. Hatta bu fonksiyona bağlı diğer fonksiyonları da okuyun.
Genelde 2 tür hata yapılıyor zaten. Fonksiyon başka bir işlem için tasarlanmıştır yada fonksiyon doğru kullanılmamıştır. Sizin verdiğiniz örnekte doğru kullanılmadığını zaten kodlardan hemen anladık. Bu işlemleri yaptıktan sonra tekrar dener misiniz? Bakalım olacak mı. :)
 
Yine olmadı ben şey diye düşünüyorum mesela normal çıkış yap diyincede direk vsdesin demiyor 1 2 saniye saydıktan sonra algılıyor vs sırasısında çıkamazsın şeyi gibi bu direk oyunu kapattığı için vsyi felan algılıyamıyor olabilir mi anlık olarak kapatıyor çünkü geriye saymadan
Birde direk vs iken çıkamazsın felan ayarlamak istemiyorum buraya bu kodları eklemişler niye çalışmıyor onu anlamak için sordum yoksa pek bi önemi yok
 
En son bir moderatör tarafından düzenlenmiş:
Ben kendi serverim de hızlı çıkış özelliğini kullanmıyorum zaten. Hızlı çıkış şunun gibi düşünebilirsin. Görev yöneticisinden direk oyunu kapatmak gibi.
Serbest moda alıp denemeye çalışın bir de. Serbest modda algılaması gerek.

Yalnız karşı taraf ile duelloyu da kontrol ettirmek için player.IsPVPInstance(vid): vid değerine karşıda ki kişinin virtual id değerini girmeniz gerekiyor.
 
Ben kendi serverim de hızlı çıkış özelliğini kullanmıyorum zaten. Hızlı çıkış şunun gibi düşünebilirsin. Görev yöneticisinden direk oyunu kapatmak gibi.
Serbest moda alıp denemeye çalışın bir de. Serbest modda algılaması gerek.

Yalnız karşı taraf ile duelloyu da kontrol ettirmek için player.IsPVPInstance(vid): vid değerine karşıda ki kişinin virtual id değerini girmeniz gerekiyor.
Serbest moddada denedim aynı şey oluyor direk kapanıyor karşıdaki kişinin virtual id derken tam olarak nasıl oluyor bi örnek verirmisiniz?
Forumun bilgi kısmında bu terimleri paylaşmak güzel olabilir mesela Virtual id derken Bkz:Virtualid gibi şeyler daha açıklayıcı olabilir kendim için demiyorum genel anlamda örnek verdim :D
 
Virtual id => vid demek. Oyuna giriş yaptığında senin bilgilerin object olarak eklenir. Objenin kimliği gibi.
 
Virtual id => vid demek. Oyuna giriş yaptığında senin bilgilerin object olarak eklenir. Objenin kimliği gibi.
:D İyi güzelde bende o kadar bilgi yok vid kullanımını bilmiyorum müsaitsen kodu düzenleyip atarmısın?
Pekta önemli değil yani müsait değilsen yapmasakta olur ona göre konuyu kapatabilirsin.
 
Yardımlarınız için teşekkürler.
Adsız.png
 
Ekran görüntüsünü paylaştığınız için teşekkür ederim.
player.IsPVPInstance fonksiyonunu daha detaylı inceledikten sonra @Trashy 'nin bilgisayarına bağlanıp beraber ufak bir düzenleme yaparak sistemi çalıştırmayı başardık. Bende bu aşamada bilmediğim bir fonksiyonu daha detaylıca öğrenme fırsatına sahip oldum. Bu yüzden böyle bir soru sorduğunuz için teşekkürler.

Bu düzenlemeyi uygulayacaklar için ufak bir bilgi;
Bu sistem %100 karşıda ki kişinin wsden kaçmasına engel olmuyor. Görev yöneticisinden istemciyi kapatabilir veya interneti kapatabilir.
Bir diğer hususta en son düello gönderilen karakterle kontrol yapılır.
Gene de bu sorunu yaşayan varsa çözmek için şu adımı uygulasın.

Not: Detaylıca test edilmediği için başka sorunlarla karşılaşabilirsiniz. Bölüm kuralları 2/6/F-2 gereği çözümü ekliyorum.

Şu kodu;
Python:
    def Yes(self):
        import player
        if player.IsPVPInstance():
            import chat
            chat.AppendChat(chat.CHAT_TYPE_INFO, "Duello'da iken oyunu kapatamassiniz.")
        else:
            import app
            app.Exit()

Şu şekilde değiştirin;
Python:
    def Yes(self):
        if constInfo.PVP_YAPIYORUM:
            import chat
            chat.AppendChat(chat.CHAT_TYPE_INFO, "Duello'da iken oyunu kapatamassiniz.")
            self.questionDialog.Close()
        else:
            app.Exit()


root/constInfo.py dosyasına şunları ekleyin;
Python:
PVP_YAPIYORUM = 0
PVP_YAPTIGIM_KISI_VID = 0


root/uitarget.py arat;
Python:
      def OnPVP(self):

En altına ekle;
Python:
        constInfo.PVP_YAPTIGIM_KISI_VID = self.vid


root/game.py arat;
Python:
      def OnUpdate(self):

En altına ekle;
Python:
        # tik basina en son pvp yapılan karakter ile kontrol yapar. Pvp bittiginde ise vid sifirlanir.
        if constInfo.PVP_YAPTIGIM_KISI_VID > 0:
            if player.IsPVPInstance(constInfo.PVP_YAPTIGIM_KISI_VID):
                constInfo.PVP_YAPIYORUM = 1
            else:
                constInfo.PVP_YAPIYORUM = 0
        else:
            constInfo.PVP_YAPIYORUM = 0
 
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst