FactoryObject GameFactory::GetObject(unsigned int refID) { Reference* reference; unsigned char type; ReferenceList::iterator it; cs.StartSession(); for (it = instances.begin(); it != instances.end() && it->first->GetReference() != refID; ++it); if (it != instances.end()) { reference = it->first.get(); type = it->second; } else reference = nullptr; cs.EndSession(); if (!reference) throw VaultException("Unknown object with reference %08X", refID); return FactoryObject(reference, type); }
FactoryObject GameFactory::GetObject(NetworkID id) { cs.StartSession(); Reference* reference = Network::Manager()->GET_OBJECT_FROM_ID<Reference*>(id); cs.EndSession(); if (!reference) throw VaultException("Unknown object with NetworkID %lld", id); return FactoryObject(reference); }
FactoryObject GameFactory::GetObject(unsigned int refID) { ReferenceList::iterator it; cs.StartSession(); for (it = instances.begin(); it != instances.end() && it->first->GetReference() != refID; ++it); Reference* reference = (it != instances.end() ? it->first : NULL); cs.EndSession(); if (!reference) throw VaultException("Unknown object with reference %08X", refID); return FactoryObject(reference); }
vector<FactoryObject> GameFactory::GetObjectTypes(unsigned char type) noexcept { vector<FactoryObject> result; ReferenceList::iterator it; cs.StartSession(); result.reserve(typecount[type]); ReferenceList copy = instances; cs.EndSession(); for (it = copy.begin(); it != copy.end(); ++it) if (it->second & type) result.push_back(FactoryObject(it->first)); return result; }
FactoryObject GameFactory::GetObject(NetworkID id) { Reference* reference; unsigned char type; cs.StartSession(); reference = Network::Manager()->GET_OBJECT_FROM_ID<Reference*>(id); if (reference) type = GetShared(reference)->second; cs.EndSession(); if (!reference) throw VaultException("Unknown object with NetworkID %llu", id); return FactoryObject(reference, type); }
vector<FactoryObject> GameFactory::GetObjectTypes(unsigned char type) noexcept { vector<FactoryObject> result; ReferenceList::iterator it; cs.StartSession(); result.reserve(typecount[type]); ReferenceList copy = instances; cs.EndSession(); for (it = copy.begin(); it != copy.end(); ++it) if (it->second & type) try { result.emplace_back(FactoryObject(it->first.get(), it->second)); } catch (...) { continue; } return result; }
vector<FactoryObject> GameFactory::GetMultiple(const vector<unsigned int>& objects) { vector<FactoryObject> result(objects.size()); multimap<Reference*, unsigned int> sort; cs.StartSession(); try { ReferenceList::iterator it; unsigned int i = 0; for (const NetworkID& id : objects) { for (it = instances.begin(); it != instances.end() && it->first->GetReference() != id; ++it); Reference* reference = (it != instances.end() ? it->first : NULL); if (!reference) throw VaultException("Unknown object with reference %08X", id); sort.insert(pair<Reference*, unsigned int>(reference, i)); ++i; } } catch (...) { cs.EndSession(); throw; } cs.EndSession(); for (const pair<Reference*, unsigned int>& reference : sort) result[reference.second] = FactoryObject(reference.first); return result; }
vector<FactoryObject> GameFactory::GetMultiple(const vector<unsigned int>& objects) { vector<FactoryObject> result(objects.size()); multimap<ReferenceList::value_type, unsigned int> sort; cs.StartSession(); try { ReferenceList::iterator it; unsigned int i = 0; for (const auto& refID : objects) { for (it = instances.begin(); it != instances.end() && it->first->GetReference() != refID; ++it); if (it == instances.end()) throw VaultException("Unknown object with reference %08X", refID); // emplace sort.insert(make_pair(*it, i)); ++i; } } catch (...) { cs.EndSession(); throw; } cs.EndSession(); for (const auto& reference : sort) result[reference.second] = FactoryObject(reference.first.first.get(), reference.first.second); return result; }
vector<FactoryObject> GameFactory::GetMultiple(const vector<NetworkID>& objects) { vector<FactoryObject> result(objects.size()); multimap<ReferenceList::value_type, unsigned int> sort; cs.StartSession(); try { unsigned int i = 0; for (const auto& id : objects) { Reference* reference = Network::Manager()->GET_OBJECT_FROM_ID<Reference*>(id); if (!reference) throw VaultException("Unknown object with NetworkID %llu", id); // emplace sort.insert(make_pair(*GetShared(reference), i)); ++i; } } catch (...) { cs.EndSession(); throw; } cs.EndSession(); for (const auto& reference : sort) result[reference.second] = FactoryObject(reference.first.first.get(), reference.first.second); return result; }
vector<FactoryObject> GameFactory::GetMultiple(const vector<NetworkID>& objects) { vector<FactoryObject> result(objects.size()); multimap<Reference*, unsigned int> sort; cs.StartSession(); try { unsigned int i = 0; for (const NetworkID& id : objects) { Reference* reference = Network::Manager()->GET_OBJECT_FROM_ID<Reference*>(id); if (!reference) throw VaultException("Unknown object with NetworkID %lld", id); sort.insert(pair<Reference*, unsigned int>(reference, i)); ++i; } } catch (...) { cs.EndSession(); throw; } cs.EndSession(); for (const pair<Reference*, unsigned int>& reference : sort) result[reference.second] = FactoryObject(reference.first); return result; }