Item Stack Sorunu

tatdirivalke

Level 1
Katılım
5 May 2025
Konular
3
Mesajlar
23
Beğeniler
6
GG Coin
209
Ticaret Değeri - 0%
0   0   0
Discord
tatdirivalke
Merhaba,

Files' ta büyülü metal efsun nesnesi arttırma kağıdı gibi nesneleri üst üste koyamıyorum,

item proto efsun nesnesi ssatırı

71084 재경비서 ITEM_USE USE_CHANGE_ATTRIBUTE 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_PKDROP | ANTI_MYSHOP ITEM_STACKABLE | LOG NONE NONE 0 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 0 0 0 0 0 0 0 0

item stacklenebilir ama üstüne koyduğumda bu eşyanın yükseltmesini değiştiremessin diyor.
 
1. root/uiinventory.py dosyasını açın

Aşağıdaki fonksiyonu aratın:


Kod:
def __DropSrcItemToDestItemInInventory

Hemen altına şunu ekleyin (yoksa):

Kod:
if srcItemSlotPos == dstItemSlotPos:
    return

Altına şu satırları da ekleyin:

Kod:
elif srcItemVID == player.GetItemIndex(dstItemSlotPos):

    self.__SendMoveItemPacket(srcItemSlotPos, dstItemSlotPos, 0)

    return



2. Aynı dosyada şu fonksiyonu aratın:

Kod:
def __CanUseSrcItemToDstItem


Altındaki şu satırı bulun:

Kod:
if item.IsRefineScroll(srcItemVNum):
    if player.REFINE_OK == player.CanRefine(srcItemVNum, dstSlotPos):
        return True


Yukarıdaki if ifadesini elif olarak değiştirin:

Kod:
elif item.IsRefineScroll(srcItemVNum):
    if player.REFINE_OK == player.CanRefine(srcItemVNum, dstSlotPos):
        return True

Altına bu kontrolü de ekleyin:

Kod:
if srcItemVNum == player.GetItemIndex(dstSlotPos):
    if player.GetItemCount(dstSlotPos) < 200:
        return True



Sonuç:
Bu düzenlemeyle birlikte aynı türdeki stacklenebilir item’lar artık envanterde üst üste sürüklendiğinde düzgün şekilde birleştirilecektir. Bu yöntem client taraflıdır ve server binary'sinde ekstra bir engel yoksa sorunsuz çalışır.

Çalışmazsa bildirin buna özel bir konu açayım.
 
DropSrcItemToDestItemInInventory:
    def __DropSrcItemToDestItemInInventory(self, srcItemVID, srcItemSlotPos, dstItemSlotPos):
        if app.ENABLE_SPECIAL_STORAGE:
            if srcItemSlotPos == dstItemSlotPos and not item.IsMetin(srcItemVID):
                return
        else:
            if srcItemSlotPos == dstItemSlotPos:
                return

        if app.[B]ENABLE_NEW_OFFLINESHOP[/B]:
            if uinewofflineshop.IsBuildingShop() and (uinewofflineshop.IsSaleSlot(player.INVENTORY, srcItemSlotPos) or uinewofflineshop.IsSaleSlot(player.INVENTORY , dstItemSlotPos)):
                chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.OFFLINESHOP_CANT_SELECT_ITEM_DURING_BUILING)
                return



def __CanUseSrcItemToDstItem:
    def __CanUseSrcItemToDstItem(self, srcItemVNum, srcSlotPos, dstSlotPos):
        if app.ENABLE_SPECIAL_STORAGE:
            if srcSlotPos == dstSlotPos and not item.IsMetin(srcItemVNum):
                return False
        else:
            if srcSlotPos == dstSlotPos:
                return False

        if item.IsRefineScroll(srcItemVNum):
            if player.REFINE_OK == player.CanRefine(srcItemVNum, dstSlotPos):
                return True
        elif item.IsMetin(srcItemVNum):
            if player.ATTACH_METIN_OK == player.CanAttachMetin(srcItemVNum, dstSlotPos):
                return True
        elif item.IsDetachScroll(srcItemVNum):
            if player.DETACH_METIN_OK == player.CanDetach(srcItemVNum, dstSlotPos):
                return True
        elif item.IsKey(srcItemVNum):
            if player.CanUnlock(srcItemVNum, dstSlotPos):
                return True

        elif (player.GetItemFlags(srcSlotPos) & ITEM_FLAG_APPLICABLE) == ITEM_FLAG_APPLICABLE:
            return True

        else:
            useType=item.GetUseType(srcItemVNum)

            if "USE_CLEAN_SOCKET" == useType:
                if self.__CanCleanBrokenMetinStone(dstSlotPos):
                    return True
            elif "USE_CHANGE_ATTRIBUTE" == useType:
                if self.__CanChangeItemAttrList(dstSlotPos):
                    return True
            elif "USE_ADD_ATTRIBUTE" == useType:
                if self.__CanAddItemAttr(dstSlotPos):
                    return True
            elif "USE_ADD_ATTRIBUTE2" == useType:
                if self.__CanAddItemAttr(dstSlotPos):
                    return True
            elif "USE_ADD_ACCESSORY_SOCKET" == useType:
                if self.__CanAddAccessorySocket(dstSlotPos):
                    return True
            elif "USE_PUT_INTO_ACCESSORY_SOCKET" == useType:
                if self.__CanPutAccessorySocket(dstSlotPos, srcItemVNum):
                    return True;
            elif "USE_PUT_INTO_BELT_SOCKET" == useType:
                dstItemVNum = player.GetItemIndex(dstSlotPos)
                print "USE_PUT_INTO_BELT_SOCKET", srcItemVNum, dstItemVNum

                item.SelectItem(dstItemVNum)

                if item.ITEM_TYPE_BELT == item.GetItemType():
                    return True
            elif app.ENABLE_USE_COSTUME_ATTR and "USE_CHANGE_COSTUME_ATTR" == useType:
                if self.__CanChangeCostumeAttrList(dstSlotPos):
                    return True
            elif app.ENABLE_USE_COSTUME_ATTR and "USE_RESET_COSTUME_ATTR" == useType:
                if self.__CanResetCostumeAttr(dstSlotPos):
                    return True

        return False


Kodlarım bu şekilde nasıl uyumlu şekilde eklerim çözemedim denedim ama syserr aldım. Destek olabilirseniz sevinirim.
 
Birinci Fonksiyon Değişikliği
__CanUseSrcItemToDstItem fonksiyonunu bulun (CTRL+F) ve şu şekilde düzenleyin:

Python:
def __CanUseSrcItemToDstItem(self, srcItemVNum, srcSlotPos, dstSlotPos):
    if app.ENABLE_SPECIAL_STORAGE:
        if srcSlotPos == dstSlotPos and not item.IsMetin(srcItemVNum):
            return False
    else:
        if srcSlotPos == dstSlotPos:
            return False

    # Genel stack kontrolü
    if srcItemVNum == player.GetItemIndex(dstSlotPos):
        if player.GetItemCount(dstSlotPos) < 200:
            return True

    # Diğer kontroller
    if item.IsRefineScroll(srcItemVNum):
        if player.REFINE_OK == player.CanRefine(srcItemVNum, dstSlotPos):
            return True
    elif item.IsMetin(srcItemVNum):
        if player.ATTACH_METIN_OK == player.CanAttachMetin(srcItemVNum, dstSlotPos):
            return True
    elif item.IsDetachScroll(srcItemVNum):
        if player.DETACH_METIN_OK == player.CanDetach(srcItemVNum, dstSlotPos):
            return True
    elif item.IsKey(srcItemVNum):
        if player.CanUnlock(srcItemVNum, dstSlotPos):
            return True

    return False

3. İkinci Fonksiyon Değişikliği
Aynı dosyada __DropSrcItemToDestItemInInventory fonksiyonunu bulun ve şu şekilde düzenleyin:

Python:
def __DropSrcItemToDestItemInInventory(self, srcItemVID, srcItemSlotPos, dstItemSlotPos):
    if app.ENABLE_SPECIAL_STORAGE:
        if srcItemSlotPos == dstItemSlotPos and not item.IsMetin(srcItemVID):
            return
    else:
        if srcItemSlotPos == dstItemSlotPos:
            return

    # Stack kontrolü
    if srcItemVID == player.GetItemIndex(dstItemSlotPos):
        self.__SendMoveItemPacket(srcItemSlotPos, dstItemSlotPos, 0)
        return

    # Offline shop kontrolü
    if app.ENABLE_NEW_OFFLINESHOP:
        if uinewofflineshop.IsBuildingShop() and (uinewofflineshop.IsSaleSlot(player.INVENTORY, srcItemSlotPos) or uinewofflineshop.IsSaleSlot(player.INVENTORY, dstItemSlotPos)):
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.OFFLINESHOP_CANT_SELECT_ITEM_DURING_BUILING)
            return

    # Normal taşıma işlemi
    self.__SendMoveItemPacket(srcItemSlotPos, dstItemSlotPos, 0)

Özellikler
  • Tüm stacklenebilir itemler için çalışır
  • Maximum stack limiti 200 olarak ayarlanmıştır (isteğe göre değiştirilebilir)
  • Offline shop ve özel depo kontrolleri korunmuştur
  • Metinler ve diğer özel itemler için mevcut kontroller korunmuştur

Nasıl Çalışır?
1. Bir itemi başka bir itemin üzerine sürüklediğinizde:
- Önce itemlerin aynı olup olmadığı kontrol edilir
- Stack limiti kontrol edilir (200'den az olmalı)
- Eğer koşullar uygunsa itemler stacklenir

Önemli Notlar
1. Değişiklik yapmadan önce uiinventory.py dosyasının yedeğini alın
2. Kodları eklerken mevcut fonksiyonları tamamen değiştirin
3. Stack limitini değiştirmek için player.GetItemCount(dstSlotPos) < 200 değerini düzenleyebilirsiniz
4. Server binary'nizde stackleme için ekstra bir engel olmadığından emin olun

Hata Durumunda
Eğer oyun açılmazsa veya hatalar alırsanız:
1. Yedeklediğiniz dosyayı geri yükleyin
2. Item proto'daki ITEM_STACKABLE flaglerini kontrol edin
3. Server binary'nizde stackleme özelliğinin açık olduğundan emin olun

Sorun yaşarsanız bildirin bu şekilde çalışması gerek.
 
Dediğiniz gibi yaptım ama syntax hatası veriyor. Aşağıda dosyayı bıraktım.
 

Ekli dosyalar

  • uiinventory.rar
    13.5 KB · Görüntüleme: 2
Bu kodları mevcut py kodlarınızla değiştirin. Yedek almayı unutmayın umarım çözüme ulaşır.
 

Ekli dosyalar

  • uiinventory.txt
    81.4 KB · Görüntüleme: 0
Geri
Üst Alt