C++ Bol seçenekli item_purge (/ip) komutu

  • Konuyu açan Konuyu açan leqions
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 4
  • Gösterim Gösterim 495

leqions

Üye
Üye
Mesaj
84
Çözümler
4
Beğeni
110
Puan
689
Ticaret Puanı
0
Selam arkadaşlar. GM hesabımda envanterden tek bir "silinmez" flagli itemi silmek için tüm envanterimi yok etmemin gerekmesi beni uzun süredir uyuz ediyordu. Ben de /ipurge - /ip komutunu yalnızca istediğim bölümleri silmesi, yalnızca istediğim vnum'a sahip itemleri silmesi ve hatta spesifik olarak istediğim tek bir slot'taki itemi silmesi amacıyla güncelleyip seçenekler ekledim.

game/src/cmd_gm.cpp:
Genişlet Daralt Kopyala
//ACMD(do_item_purge) fonksiyonunu olduğu gibi bununla değiştir:

ACMD(do_item_purge)
{
    char arg1[256];
    char arg2[256];
    two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
    if (*arg1)
    {
        if (isnhdigit(*arg1)) //vnum ile sildirmek.
        {
            DWORD vnum = 0;
            str_to_number(vnum, arg1);
            int i;
            LPITEM item;
            int found = 0;
            for (i = 0; i < INVENTORY_AND_EQUIP_SLOT_MAX; ++i)
            {
                if ((item = ch->GetInventoryItem(i)))
                {
                    if (item->GetVnum() == vnum)
                    {
                        // istege bagli kod blogu: giyilen itemi sildirmemek.
                        /*TItemPos Cell(INVENTORY, i);
                        if (Cell.IsEquipPosition() || Cell.IsBeltInventoryPosition() || Cell.IsDragonSoulEquipPosition())
                        {
                            ch->ChatPacket(CHAT_TYPE_INFO, "giyilen // kemer envanterindeki // simya penceresindeki item silinmedi mesaji");
                            return;
                        }*/
                        DWORD itemCount = ch->GetInventoryItem(i)->GetCount();
                        found += 1;
                        ITEM_MANAGER::instance().RemoveItem(item, "PURGE");
                        ch->SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 255);
                        ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: Deleted %i item(s) with vnum %i (Slot %i)",itemCount,vnum,i);
                    }
                }
            }
            if (found <= 0)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: There are no items with vnum %i", vnum);
            }
        }
        else
        {
            if (arg1[0] == 'a') // all - standart /ip komutu. alayını yok ediyor.
            {
                int         i;
                LPITEM      item;
                int found = 0;

                for (i = 0; i < INVENTORY_AND_EQUIP_SLOT_MAX; ++i)
                {
                    if ((item = ch->GetInventoryItem(i)))
                    {
                        found += 1;
                        ITEM_MANAGER::instance().RemoveItem(item, "PURGE");
                        ch->SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 255);
                    }
                }
                for (i = 0; i < DRAGON_SOUL_INVENTORY_MAX_NUM; ++i)
                {
                    if ((item = ch->GetItem(TItemPos(DRAGON_SOUL_INVENTORY, i))))
                    {
                        found += 1;
                        ITEM_MANAGER::instance().RemoveItem(item, "PURGE");
                    }
                }
                if (found > 0)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: Removed all items (Total %i)", found);
                }
                else
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: You don't have any items.");
                }
            }
            else if (arg1[0] == 'e') //equipment
            {
                int         i;
                LPITEM      item;
                int found = 0;

                for (i = INVENTORY_MAX_NUM; i < INVENTORY_AND_EQUIP_SLOT_MAX; ++i)
                {
                    if ((item = ch->GetInventoryItem(i)))
                    {
                        found += 1;
                        ITEM_MANAGER::instance().RemoveItem(item, "PURGE");
                        ch->SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 255);
                    }
                }
                if (found > 0)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: Removed %i items from Equipment window.", found);
                }
                else
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: There are no items in Equipment window.");
                }
            }
            else if (arg1[0] == 'i') //inventory
            {
                int         i;
                LPITEM      item;
                int found = 0;

                for (i = 0; i < INVENTORY_MAX_NUM; ++i)
                {
                    if ((item = ch->GetInventoryItem(i)))
                    {
                        found += 1;
                        ITEM_MANAGER::instance().RemoveItem(item, "PURGE");
                        ch->SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 255);
                    }
                }
                if (found > 0)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: Removed %i items from Inventory window.", found);
                }
                else
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: There are no items in Inventory window.");
                }
            }
            else if (arg1[0] == 'd') //dragonsoul
            {
                int         i;
                LPITEM      item;
                int found = 0;

                for (i = INVENTORY_AND_EQUIP_SLOT_MAX; i < DRAGON_SOUL_INVENTORY_MAX_NUM; ++i)
                {
                    if ((item = ch->GetItem(TItemPos(DRAGON_SOUL_INVENTORY, i))))
                    {
                        found += 1;
                        ITEM_MANAGER::instance().RemoveItem(item, "PURGE");
                    }
                }
                if (found > 0)
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: Removed %i items from DragonSoul window.", found);
                }
                else
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: There are no items in DragonSoul window.");
                }
            }
            else if(arg1[0] == 's') //envanterden manuel slot silmek için.
            {
                if (*arg2)
                {
                    if (isnhdigit(*arg2))
                    {
                        DWORD slotNum = 0;
                        str_to_number(slotNum, arg2);
                        TItemPos cell(INVENTORY, slotNum);
                        if (ch->GetItem(cell))
                        {
                            ITEM_MANAGER::instance().RemoveItem(ch->GetItem(cell), "PURGE");
                            ch->SyncQuickslot(QUICKSLOT_TYPE_ITEM, slotNum, 255);
                            ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: Removed item(s) from specified slot#%i", slotNum);
                        }
                        else
                        {
                            ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: There are no items in slot %i", slotNum);
                            return;
                        }
                    }
                    else
                    {
                        ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: Syntax for slot: /ip s slotNumber");
                        return;
                    }
                }
                else
                {
                    ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: Syntax for slot: /ip s slotNumber");
                    return;
                }
            }
            else
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: Arguments for /ip:");
                ch->ChatPacket(CHAT_TYPE_INFO, "/ip vnum = delete specified vnum (must be a number. ex. /ip 11299)");
                ch->ChatPacket(CHAT_TYPE_INFO, "/ip a = delete all");
                ch->ChatPacket(CHAT_TYPE_INFO, "/ip e = delete equipment");
                ch->ChatPacket(CHAT_TYPE_INFO, "/ip i = delete inventory(not equipment or dragonsoul)");
                ch->ChatPacket(CHAT_TYPE_INFO, "/ip d = delete dragon soul inventory");
                ch->ChatPacket(CHAT_TYPE_INFO, "/ip s = delete specified slot, requires a second argument (ex. /ip s 10 = delete slot 10)");
            }
        }
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "iPurge: Arguments for /ip:");
        ch->ChatPacket(CHAT_TYPE_INFO, "/ip vnum = delete specified vnum (must be a number. ex. /ip 11299)");
        ch->ChatPacket(CHAT_TYPE_INFO, "/ip a = delete all");
        ch->ChatPacket(CHAT_TYPE_INFO, "/ip e = delete equipment");
        ch->ChatPacket(CHAT_TYPE_INFO, "/ip i = delete inventory(not equipment or dragonsoul)");
        ch->ChatPacket(CHAT_TYPE_INFO, "/ip d = delete dragon soul inventory");
        ch->ChatPacket(CHAT_TYPE_INFO, "/ip s = delete specified slot, requires a second argument (ex. /ip s 10 = delete slot 10)");
    }
}

Kullanımı şu şekilde:​
  • /ip a : standart /ip komutu. tüm envanteri sorgusuz sualsiz yok ediyor. ("all")​
  • /ip e : yalnızca giyilen,ekipman bölümünde bulunan itemleri siliyor. ("equipment")​
  • /ip i : giyilen ekipmana veya diğer pencerelere dokunmadan, sadece envanter slotlarındaki itemleri siliyor. ("inventory")​
  • /ip d : simya envanterinde bulunanları siliyor. ("dragonsoul")​

Bir de şunlar var:​
  • /ip 'vnum' : tırnak işaretleri olmadan, envanterden silmek istediğimiz item vnum'unu giriyoruz ve sadece o vnuma sahip olan itemleri siliyor. Örnek: /ip 11209​
  • /ip s 'slot' : yine tırnak işaretleri olmadan, silmek istediğimiz itemin bulunduğu envanter slotunu yazıyoruz ve yalnızca onu siliyor. Örnek: /ip s 0​

Gerekli testleri yaptım fakat her zaman eksikler veya hatalar olabilir, gözünüze çarpan yanlış bir yer olursa lütfen düzeltmekten çekinmeyin :)
İyi forumlar.​
 
Uyarı: Bu konu açıldığından bu yana baya zaman geçmiş.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.
Geri
Üst