Çözüldü Quest Kullanmadan NPC'ye Tıklayınca Gui açtırma

  • Konuyu açan Konuyu açan Tengrist
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 4
  • Gösterim Gösterim 91
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ı.

Tengrist

Yardımsever Üye
Yardımsever Üye
MT Üye
Mesaj
1.316
Çözümler
41
Beğeni
1.095
Puan
1.309
Ticaret Puanı
0
npcye quest yardımıyla tıklayınca gui açtırabiliyorum fakat questsiz yapılabilen bir sistem varsa bildiğiniz atabilir misiniz ya da nasıl yapılır
 
Çözüm
1- OnClickedNPC zaten yok normalde, ben ekledim.
2- Npc mi diye kontrol etmeye gerek yok, zaten npc ise bu fonksiyon çağrılıyor.
3- Sonrasında vnum kontrolü yaptığınız blokta sürekli yeni bir nesne oluşturuyorsunuz ve sürekli Show ediyorsunuz.
Bir Toggle metodu yazmanız gerekiyor.

Madem vnum kontrolü yapmanız gerekiyor, virtual id yerine direkt vnum'ı geçirecek şekilde değiştirdim.
PythonPlayerInput.cpp:
Genişlet Daralt Kopyala
    if (rkInstVictim.IsNPC())
    {
        PyCallClassMemberFunc(m_ppyGameWindow, "OnClickedNPC", Py_BuildValue("(is)", rkInstVictim.GetRace(), rkInstVictim.GetNameString()));
        __SendClickActorPacket (rkInstVictim);
    }

game.py:
Genişlet Daralt Kopyala
    def OnClickedNPC(self, vnum, stName):
        chat.AppendChat(chat.CHAT_TYPE_INFO, "Npc Vnum: %d, Name: %s" % (vnum...
Örnek olarak envanter penceresini açıp kapatıyor. Interface sınıfı içerisine hangi pencereyi açacaksanız onun Toggle metodunu ekleyin ve onu çağırın.

PythonPlayerInput.cpp:
Genişlet Daralt Kopyala
// __OnClickActor icerisinde ara
    if (rkInstVictim.IsNPC())
    {
        __SendClickActorPacket (rkInstVictim);
    }
// Degistir
    if (rkInstVictim.IsNPC())
    {
        PyCallClassMemberFunc(m_ppyGameWindow, "OnClickedNPC", Py_BuildValue("(is)", rkInstVictim.GetVirtualID(), rkInstVictim.GetNameString()));
        __SendClickActorPacket (rkInstVictim);
    }

game.py:
Genişlet Daralt Kopyala
# GameWindow sınıfı içerisine ekle

    def OnClickedNPC(self, virtual_id, stName):
        chat.AppendChat(chat.CHAT_TYPE_INFO, "Npc VirtualID: %d, Name: %s" % (virtual_id, stName))
        self.interface.ToggleInventoryWindow()
 

Dosya Eklentileri

  • Screenshot 2025-06-15 224012.webp
    Screenshot 2025-06-15 224012.webp
    250,1 KB · Gösterim: 34
Örnek olarak envanter penceresini açıp kapatıyor. Interface sınıfı içerisine hangi pencereyi açacaksanız onun Toggle metodunu ekleyin ve onu çağırın.

PythonPlayerInput.cpp:
Genişlet Daralt Kopyala
// __OnClickActor icerisinde ara
    if (rkInstVictim.IsNPC())
    {
        __SendClickActorPacket (rkInstVictim);
    }
// Degistir
    if (rkInstVictim.IsNPC())
    {
        PyCallClassMemberFunc(m_ppyGameWindow, "OnClickedNPC", Py_BuildValue("(is)", rkInstVictim.GetVirtualID(), rkInstVictim.GetNameString()));
        __SendClickActorPacket (rkInstVictim);
    }

game.py:
Genişlet Daralt Kopyala
# GameWindow sınıfı içerisine ekle

    def OnClickedNPC(self, virtual_id, stName):
        chat.AppendChat(chat.CHAT_TYPE_INFO, "Npc VirtualID: %d, Name: %s" % (virtual_id, stName))
        self.interface.ToggleInventoryWindow()
hocam onclickednpc yoktu bende böyle bir şey yaptım:
class GameWindow(ui.ScriptWindow): içine şunu ekledim:
Genişlet Daralt Kopyala
    def OnClickedNPC(self, vid, name):
        import chr
        if not chr.IsNPC(vid):
            return

        npcVnum = chr.GetRace(vid)

        if npcVnum == 20381:  # Bu VNUM yalnizdag NPC'sine ait
            import uiyalnizdagarena
            if not hasattr(self, "yalnizDagArenaDialog"):
                self.yalnizDagArenaDialog = uiyalnizdagarena.YalnizDagArenaDialog()
            self.yalnizDagArenaDialog.Show()

uiyalnizdagarena.py:
Genişlet Daralt Kopyala
import ui
import net

class YalnizDagArenaDialog(ui.ScriptWindow):
    def __init__(self):
        ui.ScriptWindow.__init__(self)
        self.__LoadDialog()

    def __LoadDialog(self):
        import uiScriptLoader
        uiScriptLoader.LoadScriptFile(self, "uiscript/yalnizdagarena.py")

        self.teleportButton = self.GetChild("teleport_button")
        self.spectateButton = self.GetChild("spectate_button")

        self.teleportButton.SetEvent(self.OnTeleport)
        self.spectateButton.SetEvent(self.OnSpectate)

    def OnTeleport(self):
        net.SendChatPacket("/playerteleport 1234 5678")

    def OnSpectate(self):
        net.SendChatPacket("/playerteleport 8765 4321")

    def Open(self):
        self.Show()

    def Close(self):
        self.Hide()

npcye tıkladığımda açılmıyor.. game.py yi de ekledim

edit: chat.AppendChat(chat.CHAT_TYPE_INFO, bunu eklediğimde npc vnum 0 yazıyor
 

Dosya Eklentileri

Son düzenleme:
1- OnClickedNPC zaten yok normalde, ben ekledim.
2- Npc mi diye kontrol etmeye gerek yok, zaten npc ise bu fonksiyon çağrılıyor.
3- Sonrasında vnum kontrolü yaptığınız blokta sürekli yeni bir nesne oluşturuyorsunuz ve sürekli Show ediyorsunuz.
Bir Toggle metodu yazmanız gerekiyor.

Madem vnum kontrolü yapmanız gerekiyor, virtual id yerine direkt vnum'ı geçirecek şekilde değiştirdim.
PythonPlayerInput.cpp:
Genişlet Daralt Kopyala
    if (rkInstVictim.IsNPC())
    {
        PyCallClassMemberFunc(m_ppyGameWindow, "OnClickedNPC", Py_BuildValue("(is)", rkInstVictim.GetRace(), rkInstVictim.GetNameString()));
        __SendClickActorPacket (rkInstVictim);
    }

game.py:
Genişlet Daralt Kopyala
    def OnClickedNPC(self, vnum, stName):
        chat.AppendChat(chat.CHAT_TYPE_INFO, "Npc Vnum: %d, Name: %s" % (vnum, stName))
        self.interface.ToggleYalnizDagArenaDialog()

self.wndYalnizDag isminde bir değişken oluşturup envanter penceresinden örnek alarak gerekli pencere düzenlemelerini yapın.
initialize etmek, destroy etmek vs.
Temelde böyle bir Toggle metodu ihtiyacınızı karşılayacaktır.
interfacemodule.py:
Genişlet Daralt Kopyala
def ToggleYalnizDagArenaDialog(self):
    if self.wndYalnizDag.IsShow():
        self.wndYalnizDag.Hide()
    else:
        self.wndYalnizDag.Show()
 
Çözüm
1- OnClickedNPC zaten yok normalde, ben ekledim.
2- Npc mi diye kontrol etmeye gerek yok, zaten npc ise bu fonksiyon çağrılıyor.
3- Sonrasında vnum kontrolü yaptığınız blokta sürekli yeni bir nesne oluşturuyorsunuz ve sürekli Show ediyorsunuz.
Bir Toggle metodu yazmanız gerekiyor.

Madem vnum kontrolü yapmanız gerekiyor, virtual id yerine direkt vnum'ı geçirecek şekilde değiştirdim.
PythonPlayerInput.cpp:
Genişlet Daralt Kopyala
    if (rkInstVictim.IsNPC())
    {
        PyCallClassMemberFunc(m_ppyGameWindow, "OnClickedNPC", Py_BuildValue("(is)", rkInstVictim.GetRace(), rkInstVictim.GetNameString()));
        __SendClickActorPacket (rkInstVictim);
    }

game.py:
Genişlet Daralt Kopyala
    def OnClickedNPC(self, vnum, stName):
        chat.AppendChat(chat.CHAT_TYPE_INFO, "Npc Vnum: %d, Name: %s" % (vnum, stName))
        self.interface.ToggleYalnizDagArenaDialog()

self.wndYalnizDag isminde bir değişken oluşturup envanter penceresinden örnek alarak gerekli pencere düzenlemelerini yapın.
initialize etmek, destroy etmek vs.
Temelde böyle bir Toggle metodu ihtiyacınızı karşılayacaktır.
interfacemodule.py:
Genişlet Daralt Kopyala
def ToggleYalnizDagArenaDialog(self):
    if self.wndYalnizDag.IsShow():
        self.wndYalnizDag.Hide()
    else:
        self.wndYalnizDag.Show()
Çok sağolun hocam rehber değerinde bir bilgi.
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst