70 std::vector<Inv::SaveData>
items;
72 std::map<uint32, InventoryItemRef>::iterator itr =
mContents.begin();
75 inv = itr->second->GetMyInventory();
88 data.
flag = itr->second->flag();
90 data.
ownerID = itr->second->ownerID();
91 data.
position = itr->second->position();
92 data.
quantity = itr->second->quantity();
93 data.
singleton = itr->second->isSingleton();
94 data.
typeID = itr->second->typeID();
96 items.push_back(data);
121 if (pClient !=
nullptr) {
122 if (pClient->IsCharCreation())
125 if (pClient->IsHangarLoaded(
m_myID))
134 _log(INV__INFO,
"Inventory::LoadContents() - inventory %u(%p) already loaded.",
m_myID,
this);
142 std::vector<uint32>
items;
143 if (pClient !=
nullptr) {
144 if (pClient->IsValidSession())
145 od.
corpID = pClient->GetCorporationID();
152 _log(INV__TRACE,
"Inventory::LoadContents()::IsPlayerCorp() - Loading inventory %u(%p) with owner %u",
m_myID,
this , od.
ownerID);
159 _log(INV__TRACE,
"Inventory::LoadContents() - Loading office inventory %u(%p) for corp %u in station %s",\
160 m_myID,
this , od.
ownerID, (pClient->IsValidSession() ?
itoa(pClient->GetStationID()) :
"(invalid)"));
164 _log(INV__WARNING,
"Inventory::LoadContents() - inventory of officeID %u using corpID %u. Continuing...",
m_myID, od.
corpID);
167 if (pClient->IsValidSession()) {
168 od.
ownerID = pClient->GetCharacterID();
170 od.
ownerID = pClient->GetCharID();
174 _log(INV__TRACE,
"Inventory::LoadContents() - Loading inventory of %s(%u) with owner %u",
m_self->name(),
m_myID, od.
ownerID);
176 _log(INV__ERROR,
"Inventory::LoadContents() - Failed to get inventory items for %s(%u)",
m_self->name(),
m_myID);
178 pClient->RemoveStationHangar(
m_myID);
182 for (
auto cur : items) {
186 if (iRef.
get() ==
nullptr) {
187 _log(INV__WARNING,
"Inventory::LoadContents() - Failed to load item %u contained in %u. Skipping.", cur,
m_myID);
195 if (
sConfig.debug.UseProfiling)
205 if (iRef.
get() ==
nullptr)
208 std::map<uint32, InventoryItemRef>::iterator itr =
mContents.find(iRef->itemID());
209 std::pair <std::_Rb_tree_iterator <std::pair <const uint32, InventoryItemRef > >,
bool > test;
211 test =
mContents.emplace(iRef->itemID(), iRef);
214 _log(INV__TRACE,
"Inventory::AddItem() - Updated %s(%u) to contain (%u) %s(%u) in %s.", \
215 m_self->name(),
m_myID, iRef->quantity(), iRef->name(), iRef->itemID(),
sDataMgr.GetFlagName(iRef->flag()));
217 _log(INV__TRACE,
"Inventory::AddItem() - %s(%u) already contains %s(%u) in %s.", \
234 _log(SOV__DEBUG,
"Applying system upgrade %s to system %s...", iRef->name(),
m_self->locationID());
245 if (iRef.
get() ==
nullptr)
248 std::map<uint32, InventoryItemRef>::iterator itr =
mContents.find(iRef->itemID());
251 _log(INV__TRACE,
"Inventory::RemoveItem(1) - Updated %s(%u) to no longer contain %s(%u) in %s.", \
254 _log(INV__WARNING,
"Inventory::RemoveItem(1) - %s(%u) contents does not contain %s(%u) in %s.", \
260 for (
auto cur = range.first; cur != range.second; ++cur) {
261 if (cur->second == iRef) {
263 _log(INV__TRACE,
"Inventory::RemoveItem(2) - %s(%u) removed from %s(%u) flagMap at %s.", \
269 _log(INV__WARNING,
"Inventory::RemoveItem(2) - %s(%u) flagMap does not contain %s(%u) in %s.", \
278 std::map<uint32, InventoryItemRef>::iterator cur =
mContents.begin();
294 List(rowset, flag, ownerID);
297 rowset->
Dump(INV__LIST,
" ");
308 cur.second->GetItemRow(row);
319 cur.second->GetItemRow(row);
323 if (((ownerID == 0) or (cur.second->ownerID() == ownerID))
324 and ((flag ==
flagNone) or (cur.second->flag() == flag))) {
326 cur.second->GetItemRow(row);
334 cargoMap.emplace(cur.second->flag(), cur.second);
338 float totalVolume(0.0f);
341 totalVolume += cur.second->quantity() * cur.second->GetAttribute(
AttrVolume).get_float();
346 std::vector<InventoryItemRef> itemVecTmp;
349 itemVecTmp.push_back(cur.second);
373 if (itemVec.size() < 2)
386 for (
int i = 0, i2 = 1; (i < itemVec.size()) && (i2 < itemVec.size()); ++i, ++i2) {
389 if (itemVec[i]->categoryID() > itemVec[i2]->categoryID()) {
393 itemVec[i] = itemVec[i2];
401 itemVec[i] = itemVec[i2];
409 if (
sConfig.debug.IsTestServer)
410 _log(INV__TRACE,
"Inventory::SortVector() - %u items sorted in %.3fus with %u loops.", itemVec.size(), (
GetTimeUSeconds() - start), count);
416 std::map<uint32, InventoryItemRef>::const_iterator res =
mContents.find(
id);
428 _log(INV__ERROR,
"GetInvForOwner called on non-station item %s(%u)",
m_self->name(),
m_myID);
432 if (cur.second->ownerID() == ownerID)
433 items.push_back(cur.second);
438 if (cur.second->flag() == flag)
446 for (
auto itr = range.first; itr != range.second; ++itr )
447 if (itr->second->typeID() == typeID)
455 invMap.emplace(cur.first, cur.second);
460 for (
auto itr = range.first; itr != range.second; ++itr )
461 items.push_back(itr->second);
468 for (
auto itr = range.first; itr != range.second; ++itr )
469 items.emplace(itr->second->typeID(), itr->second);
471 if (items.size() > 0)
478 std::vector<InventoryItemRef>
items;
482 for (
auto cur : items)
483 if (cur->typeID() == typeID )
491 for (
auto itr = range.first; itr != range.second; ++itr ) {
507 if (cur.second->flag() >= lowflag && cur.second->flag() <= highflag) {
508 items.push_back(cur.second);
519 if (flags.find(cur.second->flag()) != flags.end()) {
520 items.push_back(cur.second);
530 if (cur.second->typeID() == typeID ) {
531 if (cur.second->quantity() >= qty) {
534 count += cur.second->quantity();
539 return (count >= qty);
545 std::vector<InventoryItemRef> itemVec;
549 for (
auto cur : itemVec) {
550 if (cur->quantity() >= qty) {
553 count += cur->quantity();
557 return (count >= qty);
563 std::vector<InventoryItemRef> itemVec;
567 for (
auto cur : itemVec)
568 if (cur->typeID() == typeID)
578 std::vector<InventoryItemRef> delVec;
579 std::map<uint16, InventoryItemRef> types;
580 std::map<uint16, InventoryItemRef>::iterator tItr = types.end();
583 for (
auto itr = range.first; itr != range.second; ++itr) {
589 if (iRef->isSingleton())
591 if ((ownerID == 0) or (ownerID == iRef->ownerID())) {
592 tItr = types.find(iRef->typeID());
593 if (tItr == types.end()) {
595 types.emplace(iRef->typeID(), iRef);
598 delVec.push_back(iRef);
600 tItr->second->SetQuantity(tItr->second->quantity() + iRef->quantity(),
true,
false);
605 for (
auto cur : delVec)
611 float totalVolume(0.0f);
615 totalVolume += cur.second->quantity() * cur.second->GetAttribute(
AttrVolume).get_float();
618 for (
auto itr = range.first; itr != range.second; ++itr )
619 totalVolume += itr->second->quantity() * itr->second->GetAttribute(
AttrVolume).get_float();
628 float volume(iRef->quantity() * iRef->GetAttribute(
AttrVolume).get_float());
631 _log(INV__CAPY,
"Inventory::HasAvailableSpace() - Testing %s's %s available capy of %.2f to add %u %s at %.2f (%.3f each)", \
632 m_self->name(),
sDataMgr.GetFlagName(flag), capacity, iRef->quantity(), iRef->name(), \
633 volume, iRef->GetAttribute(
AttrVolume).get_float());
636 if (volume > capacity)
700 _log(INV__WARNING,
"Inventory::GetCapacity() - Unsupported flag %s(%u) called for %s(%u)", \
715 switch (iRef->typeID()) {
717 if (daysSinceClaim > 2.0f) {
720 _log(INV__WARNING,
"Inventory::ValidateIHubUpgrade() - Upgrade %s requires a higher development index.", iRef->name());
721 throw CustomError(
"%s requires a development index of 2", iRef->name());
726 if (daysSinceClaim > 3.0f) {
729 _log(INV__WARNING,
"Inventory::ValidateIHubUpgrade() - Upgrade %s requires a higher development index.", iRef->name());
730 throw CustomError(
"%s requires a development index of 3", iRef->name());
734 _log(INV__WARNING,
"Inventory::ValidateIHubUpgrade() - Upgrade %s is not supported currently.", iRef->name());
735 throw CustomError(
"%s is not currently supported.", iRef->name());
737 if (
m_self->GetMyInventory()->ContainsItem(iRef->itemID())) {
738 _log(INV__WARNING,
"Inventory::ValidateIHubUpgrade() - Upgrade %s is already installed.", iRef->name());
739 throw CustomError(
"%s is already installed.", iRef->name());
761 GVector direction (
m_self->position(), pClient->GetShip()->position());
762 float maxDistance = 2500.0f;
767 if (direction.length() > maxDistance)
775 GVector direction (cRef->position(), pClient->GetShip()->position());
776 float maxDistance(2500.0f);
780 if (direction.length() > maxDistance)
787 float volume = iRef->GetAttribute(
AttrVolume).get_float();
788 float totalVolume = iRef->quantity() * volume;
790 _log(INV__CAPY,
"Inventory::ValidateAddItem() - Testing %s's %s available capy of %.2f to add %i %s at %.2f (%.3f each)",
791 m_self->name(),
sDataMgr.GetFlagName(flag), capacity, iRef->quantity(), iRef->name(), totalVolume, volume);
798 if (
m_self->itemID() == iRef->locationID())
799 if ((flag == iRef->flag())
802 capacity += totalVolume;
803 _log(INV__CAPY,
"Inventory::ValidateAddItem() - flag() %s (%u) == iRef->flag() %s (%u) - test capacity changed to %.2f",
804 sDataMgr.GetFlagName(flag), flag,
sDataMgr.GetFlagName(iRef->flag()), iRef->flag(), capacity);
808 if (capacity < volume) {
809 if (pClient !=
nullptr) {
810 std::map<std::string, PyRep *>
args;
811 args[
"volume"] =
new PyFloat(volume);
818 throw UserError (
"NotEnoughCargoSpaceFor1Unit")
824 throw UserError (
"NotEnoughSpecialBaySpaceOverload")
834 throw UserError (
"NotEnoughSpaceOverload")
840 throw UserError (
"NotEnoughDroneBaySpaceOverload")
846 throw UserError (
"NoSpaceForThatOverload")
856 if (totalVolume > capacity) {
858 throw UserError (
"NotEnoughSpecialBaySpace")
862 throw UserError (
"NotEnoughDroneBaySpace")
866 throw UserError (
"NotEnoughCargoSpaceOverload")
880 .
AddAmount (
"volumeAvailable", capacity);
void GetInvForOwner(uint32 ownerID, std::vector< InventoryItemRef > &items)
float GetRemainingCapacity(EVEItemFlags flag) const
#define sConfig
A macro for easier access to the singleton.
void GetInventoryVec(std::vector< InventoryItemRef > &itemVec)
float GetCapacity(EVEItemFlags flag) const
bool GetTypesByFlag(EVEItemFlags flag, std::map< uint16, InventoryItemRef > &items)
#define _log(type, fmt,...)
void StackAll(EVEItemFlags flag, uint32 ownerID=0)
InventoryItemRef FindFirstByFlag(EVEItemFlags flag) const
bool ContainsTypeByFlag(uint16 typeID, EVEItemFlags flag=flagNone) const
bool HasAvailableSpace(EVEItemFlags flag, InventoryItemRef iRef) const
void AddItem(InventoryItemRef iRef)
static void SaveItems(std::vector< Inv::SaveData > &data)
std::multimap< uint8, InventoryItemRef > m_contentsByFlag
float GetCorpHangerCapyUsed() const
Python floating point number.
void RemoveItem(InventoryItemRef iRef)
UserError & AddFormatValue(const char *name, PyRep *value)
Fluent version of the protected AddKeyword, allows for adding a keyword to the exception.
bool IsEmptyByFlag(EVEItemFlags flag) const
Advanced version of UserError that allows to send a full custom message.
void Dump(FILE *into, const char *pfx) const
Dumps object to file.
uint32 GetItemsByFlag(EVEItemFlags flag, std::vector< InventoryItemRef > &items) const
bool GetItems(OwnerData od, std::vector< uint32 > &into)
#define is_log_enabled(type)
const int64 Win32Time_Day
UserError & AddAmount(const char *name, int quantity)
Shorthand method for adding a quantity value.
bool GetItemContents(OwnerData &od, std::vector< uint32 > &into)
#define IsPlayerItem(itemID)
Python object "blue.DBRowDescriptor".
Inventory(InventoryItemRef iRef)
std::map< uint32, InventoryItemRef > mContents
Python object "dbutil.CRowset".
#define IsSpecialHoldFlag(flag)
void GetCargoList(std::multimap< uint8, InventoryItemRef > &cargoMap)
static void LoadOffices(OwnerData &od, std::vector< uint32 > &into)
#define IsFittingSlot(flag)
#define IsPlayerCorp(itemID)
#define IsCharacterID(itemID)
Python object "ccp_exceptions.UserError".
static RefPtr StaticCast(const RefPtr< Y > &oth)
Acts as static_cast from one RefPtr to another.
bool ValidateIHubUpgrade(InventoryItemRef iRef) const
uint32 GetItemsByFlagSet(std::set< EVEItemFlags > flags, std::vector< InventoryItemRef > &items) const
void GetInventoryMap(std::map< uint32, InventoryItemRef > &invMap)
RefPtr< InventoryItem > InventoryItemRef
#define IsOfficeID(itemID)
#define IsModuleSlot(flag)
#define IsCargoHoldFlag(flag)
InventoryItemRef GetItemByTypeFlag(uint16 typeID, EVEItemFlags flag=flagNone)
#define IsHangarFlag(flag)
std::vector< InventoryItemRef > SortVector(std::vector< InventoryItemRef > &itemVec)
bool ContainsTypeQtyByFlag(uint16 typeID, EVEItemFlags flag=flagNone, uint32 qty=0) const
entityID heal the character with the entityID note giving you detailed ship status information gives a list of all dynamic entities and players and their destinyState in this bubble shows some current destiny variables save all items
InventoryItemRef GetByTypeFlag(uint32 typeID, EVEItemFlags flag) const
CRowSet * List(EVEItemFlags flag, uint32 ownerID=0) const
uint32 GetItemsByFlagRange(EVEItemFlags low_flag, EVEItemFlags high_flag, std::vector< InventoryItemRef > &items) const
bool ValidateAddItem(EVEItemFlags flag, InventoryItemRef iRef) const
bool ContainsTypeQty(uint16 typeID, uint32 qty=0) const
InventoryItemRef GetByID(uint32 id) const
const char * itoa(int64 num)
Convers num to string.
float GetStoredVolume(EVEItemFlags flag, bool combined=true) const
void AddStationHangar(uint32 stationID)
bool GetSingleItemByFlag(EVEItemFlags flag, InventoryItemRef &iRef) const
UserError & AddLocationName(const char *name, uint32 locationID)
Shorthand method for adding a location's name.
Reference-counting-based smart pointer.