// Remove items
    public virtual void Remove(string instanceId, Location location, bool resetState = false, bool didCollect = false)
    {
        ComputedLocationSpawnItems computed = null;

        lock (m_itemLocations)
        {
            m_itemLocations.Remove(instanceId, location);
        }

        // No hits for this item at this location
        if (!m_locationComputedItems.TryGetValue(location.Id, out computed))
        {
            return;
        }

        LocationSpawnItemResults <T> result = null;

        if (!computed.Results.TryGetValue(instanceId, out result))
        {
            return;
        }

        result.DidCollect = didCollect;

        if (resetState)
        {
            computed.Results.Remove(instanceId);
        }

        OnItemsRemoved(instanceId, result);
    }
    protected ComputedLocationSpawnItems GetComputedItems(Location location)
    {
        ComputedLocationSpawnItems computed = null;

        m_locationComputedItems.TryGetValue(location.Id, out computed);

        return(computed);
    }
    protected ComputedLocationSpawnItems GetOrCreateLocationComputedItems(Location location)
    {
        ComputedLocationSpawnItems computed = null;

        if (!m_locationComputedItems.TryGetValue(location.Id, out computed))
        {
            computed = new ComputedLocationSpawnItems();
            m_locationComputedItems.Add(location.Id, computed);
        }

        return(computed);
    }
    public LocationSpawnItemResults <T> GetResults(string instanceId, Location location)
    {
        ComputedLocationSpawnItems computed = null;

        // No hits for this item at this location
        if (m_locationComputedItems.TryGetValue(location.Id, out computed))
        {
            LocationSpawnItemResults <T> results;

            computed.Results.TryGetValue(instanceId, out results);

            return(results);
        }

        return(null);
    }