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

leqions

Üye
Üye
Mesaj
74
Çözümler
4
Beğeni
88
Puan
669
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:
//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.​
 
Geri
Üst