NetworkID GameFactory::CreateInstance(unsigned char type, unsigned int refID, unsigned int baseID)
{
	Reference* reference;

	switch (type)
	{
		case ID_REFERENCE:
			throw VaultException("It is not possible to have a pure Reference instance");

		case ID_OBJECT:
			reference = new Object(refID, baseID);
			break;

		case ID_ITEM:
			reference = new Item(refID, baseID);
			break;

		case ID_CONTAINER:
			reference = new Container(refID, baseID);
			break;

		case ID_ACTOR:
			reference = new Actor(refID, baseID);
			break;

		case ID_PLAYER:
			reference = new Player(refID, baseID);
			break;

		default:
			throw VaultException("Unknown type identifier %X", type);
	}

	NetworkID id = reference->GetNetworkID();

	cs.StartSession();

	++typecount[type];
	instances.insert(pair<Reference*, unsigned char>(reference, type));

	cs.EndSession();

	return id;
}