bool CInterShardExchangeValidator::isExchangeAllowed(const CGameItemPtr& theItem, TShardId shardId0, TShardId shardId1) const { // allow all exchanges between characters from the same shard if (shardId0==shardId1) return true; // allow all exchanges of plot items if ( theItem->getStaticForm()->Family == ITEMFAMILY::SCROLL_R2 ) return true; // determine the maximum level for items exchanged between the 2 shards TLevelCap levelLimit= std::min(getLevelCap(shardId0),getLevelCap(shardId1)); // if item is too high level then refuse if (theItem->quality()>levelLimit) return false; // if item is flagged as non-shardExchangeable then refuse if (theItem->getStaticForm()->ShardExchangeable==false) return false; // if item is named (and not a plot item) then refuse if (!theItem->getPhraseId().empty()) return false; // we've found no reason to refuse so return true return true; }
//----------------------------------------------------------------------------- void CNamedItems::loadNamedItemsFromFile(const std::string & fileName) { CHashMap<std::string, CGameItemPtr>::iterator it; for (it = _NamedItems.begin(); it != _NamedItems.end(); ++it) { GameItemManager.destroyItem((*it).second); } _NamedItems.clear(); string path; try { path = CPath::lookup(fileName); } catch (Exception &) { nlwarning("<NAMED_ITEMS> file '%s' was not found", fileName.c_str()); return; } static CPersistentDataRecord pdr; pdr.clear(); pdr.readFromTxtFile(path.c_str()); CInventoryPtr inv = loadFromPdr(pdr); if (inv == NULL) { nlwarning("<NAMED_ITEMS> error while loading items from the PDR"); return; } const uint size = inv->getSlotCount(); nlinfo("loading '%u' named items", size); for (uint i = 0; inv->getFreeSlotCount() != inv->getSlotCount() && i < size; ++i) { if (inv->getItem(i) == NULL) continue; CGameItemPtr item = inv->removeItem(i); if (item != NULL) { if (item->getSheetId() == CSheetId::Unknown) { nlwarning("<NAMED_ITEMS> item '%u' has invalid sheet id", i); GameItemManager.destroyItem(item); continue; } if (item->getPhraseId().empty()) { nlwarning("<NAMED_ITEMS> item '%u' has no name", i); GameItemManager.destroyItem(item); continue; } if (_NamedItems.find(item->getPhraseId()) != _NamedItems.end()) { nlwarning("<NAMED_ITEMS> item '%u', name '%s' exists more than once", i, item->getPhraseId().c_str()); GameItemManager.destroyItem(item); continue; } // Yoyo: force this item to work with the new form requirement system. // BUT: do it only if _UseNewSystemRequirement==false (if LDs put true, we suppose that the named item has special req value) if(item->getUseNewSystemRequirement()==false) item->computeRequirementFromForm(); nldebug("<NAMED_ITEMS> creating named item '%s'",item->getPhraseId().c_str()); _NamedItems.insert(make_pair(item->getPhraseId(), item)); } } }