Item Stack Sorunu

tatdirivalke

Level 1
Katılım
5 May 2025
Konular
3
Mesajlar
27
Beğeniler
8
GG Coin
226
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: 5
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: 1
Çözüm
1746734214387.png



Hocam oldu çok teşekkür ederim. Emekleriniz ve desteğiniz için minnettarım. Birde çıkan uyarıyı nasıl türkçeleştirebilir.
 
Rica ederim çalışmasına sevindim umarım başka kullanıcılar içinde faydalı olur :)

Encoding tanımlamasını ekledim ekte bulunan dosyaya. Az önce ilettiğim gibi tam hazırdır kopyala yapıştır yapabilirsin py dosyana.

Ayrıca, oyun klasörünüzde şu adımları da yapmanız gerekiyor:

1. locale klasörünü bulun (genellikle root/locale/tr veya root/locale/turkey gibi bir yerde olur)

2. Bu klasördeki locale_game.txt dosyasını açın ve şu satırı ekleyin:
Kod:
STACK_LIMIT_MSG    Yığın limiti aşıldı! Maksimum %d adet üst üste koyabilirsiniz.

3. Eğer locale_game.txt dosyası UTF-8 formatında değilse, NotePad++ gibi bir editör kullanarak UTF-8 formatına dönüştürün:
- NotePad++ ile dosyayı açın
- Menüden "Kodlama" (Encoding) seçin
- "UTF-8 BOM olmadan" (UTF-8 without BOM) seçin
- Dosyayı kaydedin

4. Oyun istemcisinin çalıştırılabilir dosyasının özelliklerinde:
- Sağ tık > Özellikler
- Uyumluluk sekmesi
- "Farklı dil için sistem yerel ayarını kullan" seçeneğini işaretleyin
- Uygula ve Tamam'a tıklayın

Bu değişikliklerden sonra:
1. Oyunu yeniden başlatın
2. Türkçe karakterler artık doğru görünmeli
3. Stack limit mesajı ve diğer Türkçe metinler düzgün görüntülenmeli

Eğer hala sorun yaşıyorsanız:
1. Tüm dosyaların encoding'inin UTF-8 olduğundan emin olun
2. Oyun istemcisinin dil ayarlarını kontrol edin
3. Windows'un bölge ayarlarında Türkçe desteğinin aktif olduğundan emin olun
 

Ekli dosyalar

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