// Düzenlenmiş envanter sıralama sistemi - Disconnect problemi giderildi
#ifdef __SORT_INVENTORY_ITEMS__
// Eşyaları isimlerine göre alfabetik olarak sırala
static bool SortItems(const LPITEM& s1, const LPITEM& s2)
{
std::string name(s1->GetName());
std::string name2(s2->GetName());
return name < name2;
}
// Envanteri sıralama fonksiyonu
void CHARACTER::SortInventoryItems()
{
int lastSortInventoryPulse = GetSortInventoryPulse();
int iPulse = thecore_pulse();
// Yakın zamanda sıralama yapıldıysa bekleme süresi kontrolü
if (lastSortInventoryPulse - iPulse > 0)
{
int deltaInSeconds = ((lastSortInventoryPulse / PASSES_PER_SEC(1)) - (iPulse / PASSES_PER_SEC(1)));
int minutes = deltaInSeconds / 180;
int seconds = (deltaInSeconds - (minutes * 180));
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Envanteri tekrar sıralamak için %d saniye bekleyin."), seconds);
return;
}
// Diğer pencereler açıkken sıralamayı engelle
if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Lütfen envanteri sıralamadan önce diğer pencereleri kapatın."));
return;
}
static std::vector<LPITEM> v;
LPITEM myitems;
v.clear();
int size = INVENTORY_MAX_NUM;
// Tüm envanter eşyalarını topla ve karakterden çıkar
for (int i = 0; i < size; ++i)
{
if (!(myitems = GetInventoryItem(i)))
continue;
v.push_back(myitems);
myitems->RemoveFromCharacter();
myitems->SetSkipSave(true);
}
std::sort(v.begin(), v.end(), SortItems);
// Eşyayı yeniden yaratmadan ve veritabanına yazmadan güvenli şekilde geri ver
for (auto item : v)
{
if (item)
{
item->SetSkipSave(true);
AutoGiveItem(item, false);
}
}
// Oyuncuya bilgi ver
SetSortInventoryPulse(thecore_pulse() + PASSES_PER_SEC(180)); // 3 dakika
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Envanter başarıyla sıralandı."));
}
// Özel envanterleri sıralama fonksiyonu
void CHARACTER::SortSpecialInventoryItems(BYTE type)
{
if (!IsPC()) return;
if (!CanHandleItem()) return;
// Görev objesini al ve görev çalışıyor mu kontrol et
quest::PC* pPC = quest::CQuestManager::instance().GetPCForce(GetPlayerID());
if (!pPC || pPC->IsRunning()) return;
// Zamanlayıcı etkinliği varsa iptal et
if (m_pkTimedEvent)
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("İptal edildi."));
event_cancel(&m_pkTimedEvent);
}
int lastSortSpecialInventoryPulse = GetSortSpecialInventoryPulse();
int iPulse = thecore_pulse();
// Yakın zamanda sıralama yapıldıysa bekleme süresi kontrolü
if (lastSortSpecialInventoryPulse - iPulse > 0)
{
int deltaInSeconds = ((lastSortSpecialInventoryPulse / PASSES_PER_SEC(1)) - (iPulse / PASSES_PER_SEC(1)));
int minutes = deltaInSeconds / 180;
int seconds = (deltaInSeconds - (minutes * 180));
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Özel envanteri tekrar sıralamak için %d saniye bekleyin."), seconds);
return;
}
// Diğer pencereler açıkken sıralamayı engelle
if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Lütfen özel envanteri sıralamadan önce diğer pencereleri kapatın."));
return;
}
std::vector<LPITEM> vecItems;
vecItems.clear();
LPITEM pkItem;
int startSlot = 0, endSlot = 0;
// Türe göre özel envanter slot aralıklarını belirle
switch (type)
{
case 0: startSlot = SKILL_BOOK_INVENTORY_SLOT_START; endSlot = SKILL_BOOK_INVENTORY_SLOT_END; break;
case 1: startSlot = UPGRADE_ITEMS_INVENTORY_SLOT_START; endSlot = UPGRADE_ITEMS_INVENTORY_SLOT_END; break;
case 2: startSlot = STONE_INVENTORY_SLOT_START; endSlot = STONE_INVENTORY_SLOT_END; break;
case 3: startSlot = BOX_INVENTORY_SLOT_START; endSlot = BOX_INVENTORY_SLOT_END; break;
case 4: startSlot = EFSUN_INVENTORY_SLOT_START; endSlot = EFSUN_INVENTORY_SLOT_END; break;
case 5: startSlot = CICEK_INVENTORY_SLOT_START; endSlot = CICEK_INVENTORY_SLOT_END; break;
default: startSlot = SKILL_BOOK_INVENTORY_SLOT_START; endSlot = SKILL_BOOK_INVENTORY_SLOT_END; break;
}
// Seçilen özel envanter alanındaki eşyaları topla
for (int i = startSlot; i < endSlot; ++i)
{
if (!(pkItem = GetInventoryItem(i)))
continue;
vecItems.push_back(pkItem);
pkItem->RemoveFromCharacter();
pkItem->SetSkipSave(true);
}
std::sort(vecItems.begin(), vecItems.end(), SortItems);
// Sırala ve oyuncuya güvenli şekilde geri ver
for (auto item : vecItems)
{
if (item)
{
item->SetSkipSave(true);
AutoGiveItem(item, false);
}
}
// Oyuncuyu bilgilendir
SetSortSpecialInventoryPulse(thecore_pulse() + PASSES_PER_SEC(180)); // 3 dakika
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Özel envanter başarıyla sıralandı."));
}
#endif