void CSwitchbot::SwitchItems() { for (BYTE bSlot = 0; bSlot < SWITCHBOT_SLOT_COUNT; ++bSlot) { if (!m_table.active[bSlot]) { continue; } m_table.finished[bSlot] = false; const DWORD item_id = m_table.items[bSlot]; LPITEM pkItem = ITEM_MANAGER::Instance().Find(item_id); if (!pkItem) { continue; } LPCHARACTER pkOwner = pkItem->GetOwner(); if (!pkOwner) { return; } if (CheckItem(pkItem, bSlot)) { LPDESC desc = pkOwner->GetDesc(); if (desc) { char buf[255]; int len = snprintf(buf, sizeof(buf), LC_TEXT("Bonuschange of %s (Slot: %d) successfully finished."), pkItem->GetName(), bSlot + 1); TPacketGCWhisper pack; pack.bHeader = HEADER_GC_WHISPER; pack.bType = WHISPER_TYPE_SYSTEM; pack.wSize = sizeof(TPacketGCWhisper) + len; strlcpy(pack.szNameFrom, "[EfsunBotu]", sizeof(pack.szNameFrom)); pkOwner->GetDesc()->BufferedPacket(&pack, sizeof(pack)); pkOwner->GetDesc()->Packet(buf, len); } SetActive(bSlot, false); m_table.finished[bSlot] = true; if (!HasActiveSlots()) { Stop(); } else { CSwitchbotManager::Instance().SendSwitchbotUpdate(m_table.player_id); } } else { bool stop = true; if (SWITCHBOT_PRICE_TYPE == 1) { for (const auto& itemVnum : c_arSwitchingItems) { //CHECK_LIMITED_ITEM START if (itemVnum == 71151 || itemVnum == 76023) { if ((pkItem->GetType() == ITEM_WEAPON) || (pkItem->GetType() == ITEM_ARMOR && pkItem->GetSubType() == ARMOR_BODY)) { bool bCanUse = true; for (int i = 0; i < ITEM_LIMIT_MAX_NUM; ++i) { if (pkItem->GetLimitType(i) == LIMIT_LEVEL && pkItem->GetLimitValue(i) > 40) { bCanUse = false; break; } } if (false == bCanUse) { continue; } } else { continue; } } //CHECK_LIMITED_ITEM END if (pkOwner->CountSpecifyItem(itemVnum) >= SWITCHBOT_PRICE_AMOUNT) { stop = false; } if (pkOwner->CountSpecifyItem(itemVnum) <= 1) { if (pkOwner->GetGold() >= 500000){ pkOwner->GiveItem(71084,200); pkOwner->GiveGold(-500000); } else { pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Switchbot stopped. Not enough money.")); Stop(); } } } } else if (SWITCHBOT_PRICE_TYPE == 2) { if (pkOwner->GetGold() >= SWITCHBOT_PRICE_AMOUNT) { stop = false; } } if (stop) { Stop(); if (SWITCHBOT_PRICE_TYPE == 1) { pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Switchbot stopped. Out of switchers.")); } else { pkOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Switchbot stopped. Not enough money.")); } return; } if (SWITCHBOT_PRICE_TYPE == 1) { for (const auto& itemVnum : c_arSwitchingItems) { LPITEM pkItem = pkOwner->FindSpecifyItem(itemVnum); if (pkItem) { pkItem->SetCount(pkItem->GetCount() - SWITCHBOT_PRICE_AMOUNT); break; } } } else if (SWITCHBOT_PRICE_TYPE == 2) { pkOwner->GiveGold(-SWITCHBOT_PRICE_AMOUNT); } pkItem->ChangeAttribute(); SendItemUpdate(pkOwner, bSlot, pkItem); } } }