Envanter içi item silme / çöp butonu sistemi

leqions

Üye
Üye
Mesaj
74
Çözümler
4
Beğeni
88
Puan
669
Ticaret Puanı
0
Merhaba arkadaşlar. Bugün bir Basit Sistem Yazma Rehberi paylaştım, burada da o rehberde yazdığım sistemi paylaşıyorum.

Envanter slotları ve yang bölümü arasına yeni bir buton koyuyoruz ve buraya sürükle-bırak yaptığımız item "Emin misin?" sorusuna verilen onayla birlikte siliniyor.

Not 1: Videoyla burada paylaşılan kodlar arasında tek satırlık bir fark mevcut. "mouseModule.mouseController.DeattachObject()" fonksiyonunu, son fonksiyonumdan alıp
ilk fonksiyonuma taşıdım. Böylelikle itemle butona tıklar tıklamaz mouse'a takılı kalan item görseli yok oluyor, evet / hayır dememizi beklemiyor.
Not 2: Videoda kullandığım butonun genişliği az olduğu ve estetik görünmediği için ufak bir düzenlemeyle oraya gelecek yeni bir buton hazırladım. Zip dosyasıyla birlikte bu konuya ekledim, görsel de bu şekilde:

Untitled-8.png


Ekteki zip dosyasına "ymir work/ui/trashbutton" diziniyle birlikte TGA'ları yerleştirdim. trashbutton klasörünü, ETC packi içindeki ymir work/ui/ dizinine atarsanız, buton sağdaki örnekte olduğu gibi gözükecektir.


locale/tr/inventorywindow.py:
# BURAYI BUL:
    "name" : "InventoryWindow",

    ## 600 - (width + 오른쪽으로 부터 띄우기 24 px)
    "x" : SCREEN_WIDTH - 176,
    "y" : SCREEN_HEIGHT - 37 - 565,

    "style" : ("movable", "float",),

    "width" : 176,
    "height" : 565,
       
# BU ŞEKİLDE DEĞİŞTİR:
    "name" : "InventoryWindow",

    ## 600 - (width + 오른쪽으로 부터 띄우기 24 px)
    "x" : SCREEN_WIDTH - 176,
    "y" : SCREEN_HEIGHT - 37 - 565 - 19,

    "style" : ("movable", "float",),

    "width" : 176,
    "height" : 565 + 19,
       
       
## DÜZENLEDİĞİMİZ BÖLÜMÜN HEMEN ALTINDAKİ, CHILDREN'LARIN İÇİNDE EN TEPEDE OLANI, BUNU BUL:

    "children" :
    (
        ## Inventory, Equipment Slots
        {
            "name" : "board",
            "type" : "board",
            "style" : ("attach",),

            "x" : 0,
            "y" : 0,

            "width" : 176,
            "height" : 565,
           
## BU ŞEKİLDE DEĞİŞTİR:
           
    "children" :
    (
        ## Inventory, Equipment Slots
        {
            "name" : "board",
            "type" : "board",
            "style" : ("attach",),

            "x" : 0,
            "y" : 0,

            "width" : 176,
            "height" : 565 + 19,
           

## BU KISMI BUL:
           
                ## Item Slot
                {
                    "name" : "ItemSlot",
                    "type" : "grid_table",

                    "x" : 8,
                    "y" : 246,

                    "start_index" : 0,
                    "x_count" : 5,
                    "y_count" : 9,
                    "x_step" : 32,
                    "y_step" : 32,

                    "image" : "d:/ymir work/ui/public/Slot_Base.sub"
                },

## EN SONDAKİ VİRGÜLDEN HEMEN SONRA BİR ALT SATIRA GEÇ VE BUNU YAPIŞTIR:
           
                ## Trash Button
                {
                    "name" : "TrashButton",
                    "type" : "button",

                    "x" : 8,
                    "y" : 246 + 289,

                    "default_image" : "d:/ymir work/ui/trashbutton/trashbutton_up.tga",
                    "over_image" : "d:/ymir work/ui/trashbutton/trashbutton_hover.tga",
                    "down_image" : "d:/ymir work/ui/trashbutton/trashbutton_down.tga",
                },
root/uiinventory.py:
# root / uiinventory.py

## ARAT:
            self.costumeButton = self.GetChild2("CostumeButton")
## ALTINA YAPIŞTIR:
            self.trashButton = self.GetChild2("TrashButton")


   
# ARAT :
        if self.costumeButton:
            self.costumeButton.SetEvent(ui.__mem_func__(self.ClickCostumeButton))
           
# ALTINA YAPIŞTIR:
# (DİKKAT! TABLAMALARA DİKKAT ET, YAPIŞTIRACAĞIMIZ SATIRIN YUKARIDAKİ İF TANIMIYLA İLGİSİ YOK.
# YANİ BAŞINA ÜÇ DEĞİL, İKİ TAB BIRAKILACAK.)
        self.trashButton.SetEvent(ui.__mem_func__(self.ClickTrashButton))


   
# ARAT:
        self.mallButton = None
   
# ALTINA YAPIŞTIR:
        self.trashButton = None
   
   
   
# ARAT:
    def ClickMallButton(self):
        print "click_mall_button"
        net.SendChatPacket("/click_mall")
       
# ALTINA YAPIŞTIR:
    def ClickTrashButton(self):
        if mouseModule.mouseController.isAttached():
            attachedType = mouseModule.mouseController.GetAttachedType()
            attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()
            attachedItemSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
            attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()
            mouseModule.mouseController.DeattachObject() #DeleteMyItem'den buraya tasidim, mouse'ta takili kalan itemi burda yok etmesi daha iyi.
            self.questionDialog = uiCommon.QuestionDialog()
            self.questionDialog.SetText("Silmek istediginden emin misin?")
            self.questionDialog.SetAcceptEvent(ui.__mem_func__(self.DeleteMyItem))
            self.questionDialog.SetCancelEvent(ui.__mem_func__(self.OnCloseQuestionDialog))
            self.questionDialog.Open()
            self.questionDialog.itempos = attachedItemSlotPos
    def DeleteMyItem(self):
        net.SendDeleteFromInventory(self.questionDialog.itempos)
        self.OnCloseQuestionDialog()

UserInterface/Locale_inc.h:
//en son define'ın altına ekle:
#define TRASHBUTTON
UserInterface/Packet.h:
// HEADER_CG_....'ların bittiği yere, HEADER_GC'lere geçmeden bunu ekle:
// örnek olarak, benimki şu satırın hemen altında:
//     HEADER_CG_HANDSHAKE                         = 0xff,

#ifdef TRASHBUTTON
    HEADER_CG_DELETEFROMINV                        = 220,
#endif


// ARAT:
typedef struct command_on_click
{
    BYTE        header;
    DWORD        vid;
} TPacketCGOnClick;

// ALTINA EKLE:

#ifdef TRASHBUTTON
typedef struct packet_delfrominv
{
    BYTE header;
    DWORD position;
} TPacketCGDelFromInv;
#endif

UserInterface/PythonNetworkStream.h:
// ARAT:
        bool SendQuestConfirmPacket(BYTE byAnswer, DWORD dwPID);
// ALTINA YAPIŞTIR:
#ifdef TRASHBUTTON
        // trash button
        bool SendDeleteFromInvPacket(DWORD position);
#endif

UserInterface/PythonNetworkStreamModule.cpp:
// BU FONKSİYONU BUL:

PyObject* netSendSelectItemPacket(PyObject* poSelf, PyObject* poArgs)
{
    /*...fonksiyon içeriği...*/
}

// FONKSİYON BİTTİKTEN SONRA BİR ALT SATIRA GEÇ VE YAPIŞTIR:

#ifdef TRASHBUTTON
PyObject* netSendDeleteFromInventory(PyObject* poSelf, PyObject* poArgs)
{
    int iItemPos;
    if (!PyTuple_GetInteger(poArgs, 0, &iItemPos))
        return Py_BuildException();

    CPythonNetworkStream& rns = CPythonNetworkStream::Instance();
    rns.SendDeleteFromInvPacket(iItemPos);

    return Py_BuildNone();
}
#endif

// ARAT:
        { "RegisterErrorLog",                        netRegisterErrorLog,                        METH_VARARGS },

// ALTINA YAPIŞTIR:
#ifdef TRASHBUTTON
        { "SendDeleteFromInventory",                        netSendDeleteFromInventory,                        METH_VARARGS },
#endif

UserInterface/PythonNetworkStreamPhaseGame.cpp:
// BU FONKSİYONU BUL:
bool CPythonNetworkStream::SendQuestConfirmPacket(BYTE byAnswer, DWORD dwPID)
{
    /*..fonksiyon içeriği..*/
}

// FONKSİYON BİTTİKTEN SONRA BİR ALT SATIRA GEÇ VE YAPIŞTIR:
#ifdef TRASHBUTTON
bool CPythonNetworkStream::SendDeleteFromInvPacket(DWORD position)
{
    TPacketCGDelFromInv kPacket;
    kPacket.header = HEADER_CG_DELETEFROMINV;
    kPacket.position = position;

    if (!Send(sizeof(kPacket), &kPacket))
    {
        Tracen("SendDeleteFromInvPacket Error");
        return false;
    }
    Tracef("SendDeleteFromInvPacket");
    return SendSequence();
}
#endif

common/service.h:
// en son define'ın altına ekle:
#define TRASHBUTTON
game/src/input_main.cpp:
// CInputMain::Analyze(LPDESC d, BYTE bHeader, const char * c_pData) fonksiyonu
// içinde, şunu bul:

        case HEADER_CG_PONG:
            Pong(d);
            break;

// ÜSTÜNE YAPIŞTIR:

#ifdef TRASHBUTTON
        case HEADER_CG_DELETEFROMINV:
            if (ch)
            {
                const TPacketCGDelFromInv* p = reinterpret_cast<const TPacketCGDelFromInv*>(c_pData);
                TItemPos Cell(INVENTORY, p->position);
                LPITEM itemToDelete = ch->GetItem(Cell);
                if (itemToDelete != NULL)
                {
                    if (Cell.IsEquipPosition())
                    {
                        ch->ChatPacket(CHAT_TYPE_INFO, "Hayir.");
                        /*"Giyilen itemi silemezsin" uyarisi bu.*/
                    }
                    else
                    {
                        itemToDelete->RemoveFromCharacter();
                    }
                }
            }
            break;
#endif

game/src/packet.h:
// yine HEADER_CG...'ların en sonuna, GC'lere geçmeden bir satır ekleyeceğiz,
// örnek olarak benimki şu satırın altında:
//     HEADER_CG_CLIENT_VERSION2            = 0xf1,

#ifdef TRASHBUTTON
    HEADER_CG_DELETEFROMINV = 220,
#endif



// ARAT:
typedef struct command_on_click
{
    BYTE    header;
    DWORD    vid;
} TPacketCGOnClick;

// ALTINA YAPIŞTIR:
#ifdef TRASHBUTTON
typedef struct packet_delfrominv
{
    BYTE header;
    DWORD position;
} TPacketCGDelFromInv;
#endif

game/src/packet_info.cpp:
// ARAT:
    Set(HEADER_CG_ON_CLICK, sizeof(TPacketCGOnClick), "OnClick", true);
// ALTINA YAPIŞTIR:
#ifdef TRASHBUTTON
    Set(HEADER_CG_DELETEFROMINV, sizeof(TPacketCGDelFromInv), "DelFromInv", true);
#endif
 

Dosya Eklentileri

  • TrashButton-TGA.zip
    5,6 KB · Gösterim: 1
Sistem için teşekkürler fakat ben asıl server client root arasındaki mekanizmayı merak ediyordum onun için olabilecek basit halli bu sistem için ayrıca teşekkür ederim
 
Geri
Üst