Beispiel #1
0
 public List <Stockpile> GetIntersectingStockpiles(BoundingBox v)
 {
     return(Stockpiles.Where(pile => pile.Intersects(v)).ToList());
 }
Beispiel #2
0
        public bool RemoveResources(List <ResourceAmount> resources, Vector3 position, bool createItems = true)
        {
            Dictionary <ResourceType, ResourceAmount> amounts = new Dictionary <ResourceType, ResourceAmount>();

            foreach (ResourceAmount resource in resources)
            {
                if (!amounts.ContainsKey(resource.ResourceType))
                {
                    amounts.Add(resource.ResourceType, new ResourceAmount(resource));
                }
                else
                {
                    amounts[resource.ResourceType].NumResources += resource.NumResources;
                }
            }

            if (!HasResources(amounts.Values))
            {
                return(false);
            }


            List <Stockpile> stockpilesCopy = new List <Stockpile>(Stockpiles.Where(s => resources.All(r => s.IsAllowed(r.ResourceType))));

            stockpilesCopy.Sort((a, b) => CompareZones(a, b, position));


            foreach (ResourceAmount resource in resources)
            {
                int            count        = 0;
                List <Vector3> positions    = new List <Vector3>();
                var            resourceType = ResourceLibrary.GetResourceByName(resource.ResourceType);
                foreach (Stockpile stock in stockpilesCopy)
                {
                    int num = stock.Resources.RemoveMaxResources(resource, resource.NumResources - count);
                    stock.HandleBoxes();
                    foreach (var tag in resourceType.Tags)
                    {
                        if (CachedResourceTagCounts.ContainsKey(tag))
                        {
                            CachedResourceTagCounts[tag] -= num;
                            Trace.Assert(CachedResourceTagCounts[tag] >= 0);
                        }
                    }
                    if (stock.Boxes.Count > 0)
                    {
                        for (int i = 0; i < num; i++)
                        {
                            positions.Add(stock.Boxes[stock.Boxes.Count - 1].LocalTransform.Translation);
                        }
                    }

                    count += num;

                    if (count >= resource.NumResources)
                    {
                        break;
                    }
                }

                if (createItems)
                {
                    foreach (Vector3 vec in positions)
                    {
                        Body newEntity =
                            EntityFactory.CreateEntity <Body>(resource.ResourceType + " Resource",
                                                              vec + MathFunctions.RandVector3Cube() * 0.5f);

                        TossMotion toss = new TossMotion(1.0f + MathFunctions.Rand(0.1f, 0.2f),
                                                         2.5f + MathFunctions.Rand(-0.5f, 0.5f), newEntity.LocalTransform, position);
                        newEntity.GetRoot().GetComponent <Physics>().CollideMode = Physics.CollisionMode.None;
                        newEntity.AnimationQueue.Add(toss);
                        newEntity.UpdateRate = 1;
                        toss.OnComplete     += () => toss_OnComplete(newEntity);
                    }
                }
            }
            RecomputeCachedVoxelstate();
            return(true);
        }