void CTreasurePool::CheckTreasureItem(uint32 tick, uint8 SlotID) { if (m_PoolItems[SlotID].ID == 0) return; if ((tick - m_PoolItems[SlotID].TimeStamp) > TREASURE_LIVETIME || (m_TreasurePoolType == TREASUREPOOL_SOLO && members[0]->getStorage(LOC_INVENTORY)->GetFreeSlotsCount() != 0)) { if (!m_PoolItems[SlotID].Lotters.empty()) { //..... } else { for (uint8 i = 0; i < members.size(); ++i) { if (members[i]->getStorage(LOC_INVENTORY)->GetFreeSlotsCount() != 0) { LotInfo lot = { 0, members[i] }; m_PoolItems[SlotID].Lotters.push_back(lot); } } if (!m_PoolItems[SlotID].Lotters.empty()) { CCharEntity* PChar = m_PoolItems[SlotID].Lotters.at(rand() % m_PoolItems[SlotID].Lotters.size()).member; if (charutils::AddItem(PChar, LOC_INVENTORY, m_PoolItems[SlotID].ID, 1, true) != ERROR_SLOTID) { TreasureWon(PChar, SlotID); } else { TreasureError(PChar, SlotID); } return; } TreasureLost(SlotID); } } }
void CTreasurePool::CheckTreasureItem(uint32 tick, uint8 SlotID) { if (m_PoolItems[SlotID].ID == 0) return; if ((tick - m_PoolItems[SlotID].TimeStamp) > TREASURE_LIVETIME || (m_TreasurePoolType == TREASUREPOOL_SOLO && members[0]->getStorage(LOC_INVENTORY)->GetFreeSlotsCount() != 0) || m_PoolItems[SlotID].Lotters.size() == members.size()) { if (!m_PoolItems[SlotID].Lotters.empty()) { //give item to highest lotter LotInfo highestInfo; highestInfo.lot = 0; highestInfo.member = NULL; for(uint8 i = 0; i < m_PoolItems[SlotID].Lotters.size(); i++){ LotInfo curInfo = m_PoolItems[SlotID].Lotters[i]; if(curInfo.lot > highestInfo.lot){ highestInfo = curInfo; } } //sanity check if(highestInfo.member != NULL && highestInfo.lot!=0){ if(highestInfo.member->getStorage(LOC_INVENTORY)->GetFreeSlotsCount() != 0){ //add item as they have room! if (charutils::AddItem(highestInfo.member, LOC_INVENTORY, m_PoolItems[SlotID].ID, 1, true) != ERROR_SLOTID) { TreasureWon(highestInfo.member, SlotID); } else { TreasureError(highestInfo.member, SlotID); } } else{ //drop the item TreasureLost(SlotID); } } else{ //no one has lotted on this item, give to random member who hasnt passed // std::vector<LotInfo> tempLots; for (uint8 i = 0; i < members.size(); ++i) { bool hasPassed = false; for(uint8 j = 0; j < m_PoolItems[SlotID].Lotters.size(); j++){ if(m_PoolItems[SlotID].Lotters[j].member->id == members[i]->id){ hasPassed = true; break; } } if (members[i]->getStorage(LOC_INVENTORY)->GetFreeSlotsCount() != 0 && !hasPassed) { LotInfo templi; templi.member = members[i]; templi.lot = 1; tempLots.push_back(templi); } } if(tempLots.size()==0){ TreasureLost(SlotID); } else{ //select random member from this pool to give item to CCharEntity* PChar = tempLots.at(rand() % tempLots.size()).member; if (charutils::AddItem(PChar, LOC_INVENTORY, m_PoolItems[SlotID].ID, 1, true) != ERROR_SLOTID) { TreasureWon(PChar, SlotID); } else { TreasureError(PChar, SlotID); } tempLots.clear(); return; } } } else { for (uint8 i = 0; i < members.size(); ++i) { if (members[i]->getStorage(LOC_INVENTORY)->GetFreeSlotsCount() != 0) { LotInfo lot = { 0, members[i] }; m_PoolItems[SlotID].Lotters.push_back(lot); } } if (!m_PoolItems[SlotID].Lotters.empty()) { CCharEntity* PChar = m_PoolItems[SlotID].Lotters.at(rand() % m_PoolItems[SlotID].Lotters.size()).member; if (charutils::AddItem(PChar, LOC_INVENTORY, m_PoolItems[SlotID].ID, 1, true) != ERROR_SLOTID) { TreasureWon(PChar, SlotID); } else { TreasureError(PChar, SlotID); } return; } TreasureLost(SlotID); } } }
void CTreasurePool::CheckTreasureItem(time_point tick, uint8 SlotID) { if (m_PoolItems[SlotID].ID == 0) return; if ((tick - m_PoolItems[SlotID].TimeStamp) > treasure_livetime || (m_TreasurePoolType == TREASUREPOOL_SOLO && members[0]->getStorage(LOC_INVENTORY)->GetFreeSlotsCount() != 0) || m_PoolItems[SlotID].Lotters.size() == members.size()) { //Find item's highest lotter LotInfo highestInfo = { 0, nullptr }; for (uint8 i = 0; i < m_PoolItems[SlotID].Lotters.size(); ++i) { LotInfo curInfo = m_PoolItems[SlotID].Lotters[i]; if (curInfo.lot > highestInfo.lot) { highestInfo = curInfo; } } //Check to see if we have any lotters (excluding anyone who passed) if (highestInfo.member != nullptr && highestInfo.lot != 0) { if (highestInfo.member->getStorage(LOC_INVENTORY)->GetFreeSlotsCount() != 0) { //add item as they have room! if (charutils::AddItem(highestInfo.member, LOC_INVENTORY, m_PoolItems[SlotID].ID, 1, true) != ERROR_SLOTID) { TreasureWon(highestInfo.member, SlotID); } else { TreasureError(highestInfo.member, SlotID); } } else { //drop the item TreasureLost(SlotID); } } else { //No one has lotted on this item - Give to random member who has not passed std::vector<CCharEntity*> candidates; for (uint8 i = 0; i < members.size(); ++i) { if (charutils::HasItem(members[i], m_PoolItems[SlotID].ID) && itemutils::GetItem(m_PoolItems[SlotID].ID)->getFlag() & ITEM_FLAG_RARE) continue; if (members[i]->getStorage(LOC_INVENTORY)->GetFreeSlotsCount() != 0 && !HasPassedItem(members[i], SlotID)) { candidates.push_back(members[i]); } } if (candidates.empty()) { TreasureLost(SlotID); } else { //select random member from this pool to give item to CCharEntity* PChar = candidates.at(dsprand::GetRandomNumber(candidates.size())); if (charutils::AddItem(PChar, LOC_INVENTORY, m_PoolItems[SlotID].ID, 1, true) != ERROR_SLOTID) { TreasureWon(PChar, SlotID); } else { TreasureError(PChar, SlotID); } } } } }