Çoklu İtem Ayırma Sistemi

adv1453

Yardımsever Üye
Yardımsever Üye
MT Üye
Mesaj
438
Çözümler
42
Beğeni
213
Puan
844
Ticaret Puanı
0
spliting_items_kurwa.gif.06aef92a90d3ce86363b93932f5ff1fb.gif


upload_2020-4-21_14-29-46.png


Linkleri görebilmek için giriş yap veya kayıt ol.

Linkleri görebilmek için giriş yap veya kayıt ol.


Kaynak: Polonya metin2 forumu.
 

Dosya Eklentileri

  • Kreton-SplitAllItems.rar
    5,8 KB · Gösterim: 279
Görsel büyük oldugu için konuya dahil edememişsin
 
Kaynak belirttiğiniz için teşekkürler. :)
Linklerin kırılma ihtimaline karşı sistem dosyası foruma da yüklenmiştir..
 
@kaydadeger envanter doluyken aynı işlemi yapmayı dener misiniz? Sadece bir slot boş kalsın.
 
@Whistle envanterdeki slota göre ayırıyor mesela 200lü item var 1 slot boş 50 yazıp hepsini ayır dediniz slota koyuyorsunuz boş slot yok ise 150 tanesi duruyor
 
Eger arkada kalan bos slotlara da yerlestirmesini istiyorsaniz:

C++:
//char_item.cpp icinde bulun
    for (WORD i = index; i < INVENTORY_MAX_NUM; ++i)
        if (IsEmptyItemGrid(TItemPos(INVENTORY, i), size))
            return i;

//hemen asagisina ekleyin:

    for (WORD i = index; i >= 0; --i)
        if (IsEmptyItemGrid(TItemPos(INVENTORY, i), size))
            return i;
 
Biraz daha ekleme ve iyilestirme yaptim sistem uzerinde. Neler degisti:

Ilk olarak her ne kadar test etmesem de etkisi olabilecegini dusundugum bir performans iyilestirmesi yaptim. Simdi her defasinda itemi koyabilemek icin bastan taramak yerine en son koyulan yerin bir yanindan taramaya basliyor. Pek bir etkisinin olmayacagi dusunulebilir ama 5 sayfa envanteri tamamen 1 lik potlara ayirmak istedigimiz gibi ekstrem durumlarda fark edecektir diye dusunuyorum.

Eger koymak istedigimiz yerin ilerisinde koyabilecegimiz herhangi bir item slot yeri kalmadiysa fakat arka tarafta hala bos yerleriniz varsa, koymak istenilen yerin hemen bir solundan baslayarak yerlestirmeye kaldigi yerden devam ediliyor.

Hem ileriye hem de geriye dogru yerlestirme de bazi durumlar da karsilasilan ufak bir "bug" cozuldu.



Degisikilikleri eklemek isteyenler:

C++:
#char.h dosyasinda asagidaki satiri bulun

int GetEmptyInventoryFromIndex(WORD index, BYTE size) const;

#asagisina ekleyin

int GetEmptyInventoryFromIndexBackwards(WORD Index, BYTE size) const;

C++:
#char_item.cpp dosyasinda asagidaki fonksiyonu bulun

int CHARACTER::GetEmptyInventoryFromIndex(WORD index, BYTE size) const

#bu fonksiyonun hemen bitimine asagidaki fonksiyonu ekleyin

int CHARACTER::GetEmptyInventoryFromIndexBackwards(WORD index, BYTE size) const
{
    if (index <= 0)
        return -1;

    for (WORD i = index; i >= 0; --i)
        if (IsEmptyItemGrid(TItemPos(INVENTORY, i), size))
            return i;

    return -1;
}
C++:
#cmd_general.cpp dosyasinda asagidaki satiri bulun
ACMD(do_split_items)

#asagidaki kodla degistirin
ACMD(do_split_items)
{
    if (!ch)
        return;

    const char* command;
    char arg1[256], arg2[256], arg3[256];
    command = two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
    one_argument(command, arg3, sizeof(arg3));

    if (!*arg1 || !*arg2 || !*arg3)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "ERROR: WRONG COMMAND USE! PLEASE REPORT THIS TO A GM!");
        return;
    }

    if (!ch->CanWarp())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Wait a few seconds before using this!");
        return;
    }

    WORD originalCell;
    WORD count;
    WORD startingCell;

    str_to_number(originalCell, arg1);
    str_to_number(count, arg2);
    str_to_number(startingCell, arg3);

    LPITEM item = ch->GetInventoryItem(originalCell);

    if (item != NULL)
    {
        WORD itemCount = item->GetCount();
        WORD lastEmptyCell = startingCell;
        BYTE searchForward = 1;
        int emptyPos;

        while (itemCount > 0)
        {
            if (searchForward == 1)
            {
                emptyPos = ch->GetEmptyInventoryFromIndex(lastEmptyCell, item->GetSize());
                if (emptyPos == -1)
                {
                    searchForward = 0;
                    lastEmptyCell = startingCell;
                }
            }

            if (searchForward == 0)
            {
                emptyPos = ch->GetEmptyInventoryFromIndexBackwards(lastEmptyCell, item->GetSize());
                if (emptyPos == -1)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, "INVENTORY IS FULL");
                    break;
                }
            }

            if (ch->MoveItem(TItemPos(INVENTORY, originalCell), TItemPos(INVENTORY, emptyPos), count))
            {
                itemCount -= count;

                //This is where our original item has less item count than the number we are substracting everytime
                //This means we need to determine if we are gonna do a swapping
                //After doing a swapping we simply exit from the function
                if (count > itemCount)
                {
                    //FORWARD SWAPPING CONDITION
                    if (searchForward == 1 && (originalCell > startingCell) && (emptyPos > originalCell))
                    {
                        ch->MoveItem(TItemPos(INVENTORY, emptyPos), TItemPos(INVENTORY, originalCell), (count - itemCount));
                        return;
                    }

                    //BACKWARD SWAPPING CONDITION
                    if (searchForward == 0 && (originalCell > emptyPos))
                    {
                        ch->MoveItem(TItemPos(INVENTORY, emptyPos), TItemPos(INVENTORY, originalCell), (count - itemCount));
                        return;
                    }
                    //If not doing any swapping make sure that amount of item we will carry is equal to our itemcount
                    count = itemCount;
                }
            }
            else
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "ERROR WHEN MOVING ITEM");
                return;
            }
            lastEmptyCell = emptyPos;
        }
    }
}
 
@Finnael süpersiniz. :)
Konuya sunduğunuz katkılardan dolayı teşekkür ederim..
:disney-is-frozen18:
 
Merhaba, sistemi ekledim fakat çalışmıyor, ayrıca hiç bir şekilde syser almıyorum ne yapabilirim
 
Yanlış eklemiş olabilirsin. Sistem sorunsuz çalışıyor.
 
Baya gelistirdim bu sistemi bu arada. Neredeyse her seyi sifirdan yazdim. Cok optimize calisiyor. 200'luk efsun nesnesi 1 li itemler seklinde ayirmak icin 300 kusur packet yollamak yerine sadece 7 packet yolluyor. Aynı optimazsyonu toplu sandik acma sistemlerinde de yapmayi dusunuyorum. Gereksiz yere yuzlerce packet yollamaya gerek yok. Yakin bir zaman da paylasirim belki.

 
Son düzenleme:
Sistemin k envanterine uyarlı hali varmı yada yapabilen örnek bi kod paylaşılsa çok iyi olur
 
Geri
Üst