/// <summary> /// Takes the requested amount from the Property. /// </summary> /// <param name="property">Source Property</param> /// <param name="amount">Requested Amount</param> /// <returns>Actual Amount</returns> public int Take(CollectableProperty property, int amount) { // Check for Right Collectable Type if (property.GetType() != AcceptedCollectableType) { throw new NotSupportedException("Not supported Collectable Property"); } // Ensure both Items are Part of the same Engine if (Item.Engine == null) { throw new NotSupportedException("Collector is not part of the Engine"); } if (property.Item.Engine == null) { throw new NotSupportedException("Collectable is not part of the Engine"); } if (Item.Engine != property.Item.Engine) { throw new NotSupportedException("Collector and Collectable are not part of the same Engine"); } // Check the right distance if (Item.GetDistance(Item, property.Item) > CollectorRange + property.CollectableRadius) { return(0); } // Cap to the available Capacity amount = Math.Min(amount, Capacity - Amount); // Request Good int result = property.Take(this, amount); // Finalize transfer. Amount += result; return(result); }
/// <summary> /// Give the given amount to the given Destination. /// </summary> /// <param name="property">Destination Property</param> /// <param name="amount">Requested Amount</param> /// <returns>Actual Amount</returns> public int Give(CollectableProperty property, int amount) { // Check for Right Collectable Type if (property.GetType() != AcceptedCollectableType) { throw new NotSupportedException("Not supported Collectable Property"); } // Ensure both Items are Part of the same Engine if (Item.Engine == null) { throw new NotSupportedException("Collector is not part of the Engine"); } if (property.Item.Engine == null) { throw new NotSupportedException("Collectable is not part of the Engine"); } if (Item.Engine != property.Item.Engine) { throw new NotSupportedException("Collector and Collectable are not part of the same Engine"); } // Distanz überprüfen if (Item.GetDistance(Item, property.Item) > CollectorRange + property.CollectableRadius) { return(0); } // Check for available Amount amount = Math.Min(amount, Amount); // Request int result = property.Give(this, amount); // Finalize transfer Amount -= result; return(result); }
/// <summary> /// Default Constructor for the Type Mapper. /// </summary> /// <param name="item">Related Engine Item</param> /// <param name="property">Related Engine Property</param> public CollectableState(Item item, CollectableProperty property) : base(item, property) { // Bind Radius CollectableRadius = property.CollectableRadius; property.OnCollectableRadiusChanged += (i, v) => { CollectableRadius = v; }; }