| 222 | } |
| 223 | |
| 224 | ItemPtr ItemDatabase::itemShared(ItemDescriptor descriptor, Maybe<float> level, Maybe<uint64_t> seed) const { |
| 225 | if (!descriptor) |
| 226 | return {}; |
| 227 | |
| 228 | ItemCacheEntry entry{ descriptor, level, seed }; |
| 229 | MutexLocker locker(m_cacheMutex); |
| 230 | if (ItemPtr* cached = m_itemCache.ptr(entry)) |
| 231 | return *cached; |
| 232 | else { |
| 233 | locker.unlock(); |
| 234 | |
| 235 | ItemPtr item = tryCreateItem(descriptor, level, seed); |
| 236 | get<2>(entry) = item->parameters().optUInt("seed"); // Seed could've been changed by the buildscript |
| 237 | |
| 238 | locker.lock(); |
| 239 | return m_itemCache.get(entry, [&](ItemCacheEntry const&) -> ItemPtr { return std::move(item); }); |
| 240 | } |
| 241 | } |
| 242 | |
| 243 | ItemPtr ItemDatabase::item(ItemDescriptor descriptor, Maybe<float> level, Maybe<uint64_t> seed, bool ignoreInvalid) const { |
| 244 | if (!descriptor) |
no test coverage detected