- Mesaj
- 78
- Çözümler
- 4
- Beğeni
- 100
- 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.
Kullanımı şu şekilde:
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.