Exemple #1
0
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;
}
Exemple #5
0
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);
}
Exemple #6
0
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;
}
Exemple #8
0
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;
}
Exemple #9
0
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;
}